dirent struct处理的最大文件/目录数

时间:2014-04-12 17:06:58

标签: c

我有一个目录(让我们称之为目录A),其中包含~15000个目录(B1,B2,..,B15000),B的每个目录都包含一个文件(让&#39 ; s称之为" raw")我想读。 所以我想读: A / B1 /生 A / B2 /生 ...

我事先并不知道B的目录名称,但我知道目录A的名称,并且每个B目录下都有一个名为raw的文件。

所以我使用了dirent以便在opendir A中移动并移动其中的所有目录 - 提取包含在d_name字段中的名称,但是在我读取了264个目录的名称后停止了运行!!

我想知道struct dirent是否不能容纳超过264个目录?任何人都可以帮助我吗?

先谢谢。


[评论代码]

DIR* dRoot = opendir(argv[1]);
assert(dRoot != NULL);
struct dirent* dir;

while((dir = readdir(dRoot)))
{
    //suppose dirName is a string "argv[1]/dir->d_name/raw"
    FILE* file = fopen(dirName,"r");

    //do something

    fclose(file);
}

closedir(dRoot);

1 个答案:

答案 0 :(得分:2)

readdir()为每个返回指针的struct dirent分配内存。 dirent会自动取消分配closedir(),因此当您不再需要任何特定 free()时,您无法dirent该内存,并且您不能在dirent之后使用任何closedir()。我想(虽然不太可能)你的程序不能为dirent s分配更多内存是可能的。
你可以在errno返回NULL之后检查readdir()以查找。

如果这是问题所在,您可以使用readdir_r(),它使用dirent*进行您提供的分配(甚至可能是堆栈上的本地变量),您可以重复使用它对于所有dirent s,一个接一个。 readdir_r()的一个警告是struct dirent的大小取决于文件系统,您需要确保分配足够大。