0

我正在编写一个 C 程序,它使用 DIR、opendir() 和 readdir() 查看当前目录中的所有文件,然后将它们分配给如下所示的 dirent 结构。

int main(int argc, char *argv[])
{
    DIR *d;
    char *dir_name = ".";
    struct stat s;

    d = opendir(dir_name);

    while (1) {
        struct dirent *entry;  

        entry = readdir(d);

        if (!entry) 
            break;

        //how to check if this is a text file before printing?
        printf ("%s\n", entry->d_name);
    }
    closedir(d)
}

我需要了解的是如何测试文件以查看它是否是文本文件。我想到了使用 stat() 来查看模式。我可以通过这种方式排除目录。对于二进制文件,我认为我可以寻找可执行位,但这对于脚本来说是个问题,例如,它们是可执行的文本文件。

关于我如何能够以编程方式仅过滤文本文件的任何建议?

4

2 回答 2

3

通过使用 libmagic 并查看 mime 类型

于 2013-04-28T13:01:17.070 回答
-1

我放弃了尝试让 libmagic 工作,只是决定使用以下算法循环遍历文件的内容以查找目录和非 ascii 字符。这里可能存在某种缺陷,但它似乎适用于我测试过的文件。

is_text = 1;

while ((r = read(fs, &ch, sizeof(ch))) != 0) {
  if (r < 0) {
    is_text = 0;
    break;
  }
  if (ch < 0) {
    is_text = 0;
    break;
  }
}
于 2013-04-28T21:08:04.873 回答