经典readdir
错误:pDirent->d_name
是目录条目的名称,而不是文件的路径.它是"1"
,"4-5.c"
等等.所以你的stat
调用是在当前目录中寻找具有该名称的文件,而不是在MyDirectory
.
检查返回值stat
.你会看到它ENOENT
- 除了.
和..
当前目录中存在的和.当stat
出现故障时,stat结构的内容是不确定的.
如果你opendir
在一个目录以外的地方调用.
,那么要对返回的名称做几乎任何有用的事情,你需要构建一个完整的路径.将传递的路径复制opendir
到具有足够空间的缓冲区和文件名,并将每个文件名复制到该缓冲区.概念验证代码(省略错误检查等):
char *directory = "MyDirectory"; size_t directory_length = strlen(directory); char *path = malloc(directory_length + 1 + NAME_MAX); strcpy(path, directory); path[directory_length] = '/'; while ((pDirent = readdir(pDir)) != NULL) { strcpy(path + directory_length + 1, pDirent->d_name); if (stat(path, &vStat) == -1) { perror(path); continue; } … }