2 回答

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超5個(gè)贊
經(jīng)典readdir錯(cuò)誤:pDirent->d_name是目錄條目的名稱,而不是文件的路徑。這"1","4-5.c"等于是你的stat電話正在尋找該名稱的文件在當(dāng)前目錄中,而不是下MyDirectory。
檢查的返回值stat。您會(huì)看到它是ENOENT- .和和..,除了在當(dāng)前目錄中也存在。當(dāng)stat出現(xiàn)故障時(shí),stat結(jié)構(gòu)的內(nèi)容是不確定的。
如果您opendir在以外的目錄中進(jìn)行調(diào)用,.則要對(duì)返回的名稱執(zhí)行幾乎所有有用的操作,您需要構(gòu)建完整路徑。將傳遞到的路徑復(fù)制opendir到緩沖區(qū)中,該緩沖區(qū)要有足夠的空間以容納斜杠和文件名,然后將每個(gè)文件名復(fù)制到該緩沖區(qū)。概念驗(yàn)證代碼(省略錯(cuò)誤檢查等):
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;
}
…
}