2013-04-05 3 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' для каталогов. –

+0

Вы пробовали '../' вместо '..' в вызове' print_dir'? Не знаю, работает ли это, но мне просто интересно. – maditya

+0

@maditya no ../ не будет работать – swiftk

ответ

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

0

Я протестировал его на своем компьютере (и создал каталог ../dirtest для этого), и, похоже, он работает нормально. Вы уверены, что ваш каталог создан и что вы ищете в нужном месте?

+0

yes У меня есть несколько каталогов, и он находит только один, но не другие, и я ищу подходящее место. – swiftk

+0

. Какое имя найденной в нем директории? – maditya

+0

это просто каталоги, которые я создал для проверки этой функции. – swiftk

Смежные вопросы