2013-04-05 112 views
0

我需要在不同的目錄中找到特定的目錄,但由於某種原因,我的代碼在當前目錄中查找目錄,但是當我開始在父目錄中搜索特定的命名目錄時,找不到它那裏在另一個目錄中查找目錄

#include <dirent.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <sys/stat.h> 
#include <sys/types.h> 
#include <unistd.h> 
#include <string.h> 
void print_dir(char *dir_n, char *file) 
{ 
DIR *dir = opendir(dir_n); 

struct dirent *Dirent; 
struct stat stats; 

while(1) 
{ 
    Dirent = readdir(dir); 
    if (Dirent == NULL) 
    { 
     break; 
    } 

     stat(Dirent->d_name, &stats); 
     if (S_ISDIR(stats.st_mode)) 
     { 
      if(strcmp(file ,Dirent->d_name) == 0 && S_ISDIR(stats.st_mode)) 
      { 
       printf("found\n"); 
       break; 

      } 
     } 
} 
closedir(dir); 
} 
int main(int argc, const char * argv[]) 
{ 
    print_dir("..", "dirtest"); 
    return 0; 
} 
+0

你不需要'stat'打電話得到,如果「文件」是一個目錄。 'dirent'結構有一個'd_type'成員,它是目錄的'DT_DIR'。 – 2013-04-05 02:57:31

+0

您在'print_dir'調用中是否嘗試過'../'而不是'..'?不知道這是否有效,但我只是好奇。 – maditya 2013-04-05 02:58:35

+0

@maditya no ../將不起作用 – swiftk 2013-04-05 03:10:52

回答

2

您需要檢查系統調用的返回狀態,特別是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; 
} 
+0

謝謝你的解釋 – swiftk 2013-04-05 13:51:57

0

我測試了它在我的電腦(和創建的目錄../dirtest的),它似乎工作正常。你確定你的目錄是否已經創建,並且你在正確的地方搜索?

+0

是的,我有幾個目錄,它找到一個,但沒有找到其他人,我在正確的地方搜索 – swiftk 2013-04-05 03:06:50

+0

它找到的目錄的名稱是什麼? – maditya 2013-04-05 03:11:55

+0

它只是我創建的目錄來測試該功能 – swiftk 2013-04-05 03:13:37