我有一个目录(让我们称之为目录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);
答案 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
的大小取决于文件系统,您需要确保分配足够大。