dirent struct处理的最大文件/目录数
我有一个目录(我们称之为目录a),其中包含约15000个目录(B1,B2,…,B15000),B的每个目录都包含一个我要读取的文件(我们称之为“raw”)。 所以我想读: A/B1/原材料 A/B2/raw 我事先不知道B的目录名,但我知道A目录的名称,每个B的目录都有一个名为raw的文件 所以我使用dirent来打开dir A并移动其中的所有目录-提取d_name字段中包含的名称,但是在我读取264个目录的名称后,运行就停止了 我想知道struct dirent是否不能容纳超过264个目录?有人能帮我吗 提前谢谢dirent struct处理的最大文件/目录数,c,C,我有一个目录(我们称之为目录a),其中包含约15000个目录(B1,B2,…,B15000),B的每个目录都包含一个我要读取的文件(我们称之为“raw”)。 所以我想读: A/B1/原材料 A/B2/raw 我事先不知道B的目录名,但我知道A目录的名称,每个B的目录都有一个名为raw的文件 所以我使用dirent来打开dir 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);
readdir()
为它返回指向的每个struct dirent
分配内存。dirent
在closedir()
上自动解除分配,因此当您不再需要任何特定的dirent
时,您不能释放该内存,并且在closedir()
之后,您不能使用任何dirent
。我认为您的程序可能(尽管不太可能)无法为dirent
s分配更多内存。
您可以在readdir()之后检查errno
,
以找到答案
如果这是问题所在,您可以改为使用readdir\u r()
,它将dirent*
用于您提供的分配(甚至可能是堆栈上的局部变量),并且您可以对所有dirent
逐个重用它。readdir\u r()
的一个警告是struct dirent
的大小取决于文件系统,您需要确保您的分配足够大。如何读取目录?你能给我们看一些代码吗?最好是a.DIR*dRoot=opendir(argv[1]);断言(dRoot!=NULL);结构方向*dir;while((dir=readdir(dRoot)){//假设dirName是一个字符串“argv[1]/dir->d_name/raw”FILE*FILE=fopen(dirName,r”);//做点什么fclose(FILE)}closedir(dRoot);我看到的是,虽然我没有浏览所有依赖dRoot的目录,但我还是跳出了这个循环!似乎“dir->d_name”在目录号264后包含NULL!我假设您检查了当前目录和父目录(名为“
和”。“
)?另外,程序的参数是什么(argv[1]
)?是否检查文件是否正确打开(即文件
不是空
)?你检查它是一个目录而不是一个文件?如何创建和初始化dirName
?问题不在于目录的数量。您可能在关闭文件时遇到问题;您的程序中的空间可能已用完;您可能没有检查是否已成功打开文件;你可能会遇到各种各样的问题。但是对于readdir()
可以读取的目录大小没有具体的上限。