检查文件是否是C中的特定类型

时间:2012-09-05 06:30:43

标签: c linux directory iteration header-files

我正在编写我的第一个C程序,尽管我来自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语句?

6 个答案:

答案 0 :(得分:3)

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

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

当然,请注意,这假设您的所有标头文件都有.h扩展名,这可能是也可能不是,C标准并未规定标头文件必须具有.h扩展名。< / p>

答案 1 :(得分:2)

每个dirent结构都有一个包含文件名称的d_name,所以我想看看是否有一些模式,如.h或{{1 }}

这将是代码:

.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()

答案 2 :(得分:2)

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

维基百科有一篇好文章herehere。后一种想法被称为幻数数据库,这实际上意味着如果文件包含blah序列,那么它就是数据库中列出的匹配类型。有时这个号码对地点有限制,有时也没有。这种方法虽然比文件扩展名检测慢,但IMO更准确。

但话又说回来,对于像查看它的标题一样简单的事情,这可能有点矫枉过正XD

答案 3 :(得分:1)

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

或者,您可以运行'file'命令并解析其结果。

答案 4 :(得分:0)

您可能只想查看文件扩展名。使用dirent,您需要查看d_name

答案 5 :(得分:0)

这取决于你。

最简单的方法是查看文件名(d_name),并检查它是否以“.h”或“.hpp”等结尾。

另一方面,打开文件并实际读取它以查看它是否是有效的c / c ++将会更复杂......你可以通过编译器运行它,但并不是每个标题都可以自行运行,所以测试会给你很多假阴性。