您需要檢查系統調用的返回狀態,特別是stat()
。
發生了什麼事是你讀的..
目錄中找到一個名字,但是當你調用stat()
,你在./name
,而不是../name
這樣做。
此代碼應該證明了這一點:
#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>
#include <errno.h>
void print_dir(char *dir_n, char *file)
{
DIR *dir = opendir(dir_n);
if (dir == 0)
{
int errnum = errno;
fprintf(stderr, "error: opendir(\"%s\") failed (%d: %s)\n", dir_n, errnum, strerror(errnum));
exit(1);
}
struct dirent *Dirent;
while ((Dirent = readdir(dir)) != 0)
{
struct stat stats;
if (stat(Dirent->d_name, &stats) < 0)
{
int errnum = errno;
fprintf(stderr, "error: failed to stat(\"%s\") (%d: %s)\n", Dirent->d_name, errnum, strerror(errnum));
}
else if (S_ISDIR(stats.st_mode))
{
if (strcmp(file, Dirent->d_name) == 0)
{
printf("found directory %s (inode = %ld)\n", Dirent->d_name, (long)stats.st_ino);
break;
}
else
printf("found directory %s - not a match for %s\n", Dirent->d_name, file);
}
else
{
printf("%s is not a directory\n", Dirent->d_name);
}
}
closedir(dir);
}
int main(void)
{
print_dir("..", "dirtest");
return 0;
}
這微不足道的變種應查找目錄../dirtest
如果它存在:
#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>
#include <errno.h>
void print_dir(char *dir_n, char *file)
{
DIR *dir = opendir(dir_n);
if (dir == 0)
{
int errnum = errno;
fprintf(stderr, "error: opendir(\"%s\") failed (%d: %s)\n", dir_n, errnum, strerror(errnum));
exit(1);
}
struct dirent *Dirent;
while ((Dirent = readdir(dir)) != 0)
{
char fullname[1024];
snprintf(fullname, sizeof(fullname), "%s/%s", dir_n, Dirent->d_name);
struct stat stats;
if (stat(fullname, &stats) < 0)
{
int errnum = errno;
fprintf(stderr, "error: failed to stat(\"%s\") (%d: %s)\n", fullname, errnum, strerror(errnum));
}
else if (S_ISDIR(stats.st_mode))
{
if (strcmp(file, Dirent->d_name) == 0)
{
printf("found directory %s (%s) (inode = %ld)\n", Dirent->d_name, fullname, (long)stats.st_ino);
break;
}
else
printf("found directory %s - not a match for %s\n", fullname, file);
}
else
{
printf("%s is not a directory\n", fullname);
}
}
closedir(dir);
}
int main(void)
{
print_dir("..", "dirtest");
return 0;
}
你不需要'stat'打電話得到,如果「文件」是一個目錄。 'dirent'結構有一個'd_type'成員,它是目錄的'DT_DIR'。 – 2013-04-05 02:57:31
您在'print_dir'調用中是否嘗試過'../'而不是'..'?不知道這是否有效,但我只是好奇。 – maditya 2013-04-05 02:58:35
@maditya no ../將不起作用 – swiftk 2013-04-05 03:10:52