检查文件是否是C中的特定types

我正在编写我的第一个C程序,尽pipe我来自C ++背景。

我需要遍历一个文件目录,并检查该文件是否是一个头文件,然后返回计数。

我的代码如下,这是相当简单的,我想:

static int CountHeaders( const char* dirname ) { int header_count = 0; DIR* dir_ptr; struct dirent* entry; dir_ptr = opendir( dirname ); while( ( entry = readdir( dir_ptr ) ) ) { if ( entry->d_type == DT_REG ) { //second if statement to verify the file is a header file should be??? ++header_count; } } closedir( dir_ptr ); return header_count; } 

这是一个很好的if语句来检查文件是否是头文件?

Solutions Collecting From Web of "检查文件是否是C中的特定types"

每个dirent结构都有一个包含文件名的d_name ,所以我会查看是否遵循某种模式,如以.h.hpp

这将是代码大致如下:

 int len = strlen (entry->d_name); if ((len >= 2) && strcmp (&(entry->d_name[len - 2]), ".h") == 0)) header_count++; if ((len >= 4) && strcmp (&(entry->d_name[len - 4]), ".hpp") == 0)) header_count++; 

当然,这样做不会真正吸引邪恶的人们称呼他们的可执行文件ha_ha_fooled_you.hpp但是他们只是少数。

你甚至可能想要考虑一个endsWith()函数来让你的生活更轻松:

 int endsWith (char *str, char *end) { size_t slen = strlen (str); size_t elen = strlen (end); if (slen < elen) return 0; return (strcmp (&(str[slen-elen]), end) == 0); } : if (endsWith (entry->d_name, ".h")) header_count++; if (endsWith (entry->d_name, ".hpp")) header_count++; 

有比检查文件扩展名更好的方法。

维基百科在这里和这里有一篇很好的文章。 后一种想法被称为幻数数据库,它基本上意味着如果一个文件包含盲序列,那么它就是数据库中列出的匹配类型。 有时候,这个号码对地点有限制,有时它不会。 尽管比文件扩展名检测慢,但这种方法的IMO更准确。

但是,再一次,像检查是否它的头,如此简单的事情,这可能是一个矫枉过正的XD

只需检查文件扩展名是否为.h ,如下所示:

 const char *ext = strrchr (entry->d_name, '.'); if ((ext != NULL) && (!strcmp (ext+1, "h"))) { // header file } 

当然,请注意,假设所有的头文件都有一个.h扩展名,这个扩展名可能不一定是真的,C标准没有规定这个头文件必须有.h扩展名。

您可以检查最后几个字符是否为头文件扩展名之一.h,.hpp等。使用dirent struct的d_name作为文件的名称。

或者,您可以运行“文件”命令并解析其结果。

你可能只是想检查文件扩展名。 使用dirent ,你会想看看d_name

这取决于你。

最简单的方法就是查看文件名(d_name),并检查它是否以“.h”或“.hpp”之类的东西结束。

另一方面,打开文件并真正阅读它来查看它是否有效,c / c ++将会变得更加复杂……你可以通过编译器来运行它,但并不是每个头文件都可以自行运行,所以测试会给你很多的错误的否定。