2016-04-02 18 views
0

Kodum çalışmıyor. Komut satırı argümanı olarak verilen dizindeki tüm dizinleri görüntülemem gerekiyor.Tüm dizinleri yinelemeli olarak nasıl listeleyebilirim?

#include <stdio.h> 
#include <dirent.h> 
#include <sys/stat.h> 
#include <sys/types.h> 
#include <stdlib.h> 
#include <unistd.h> 

struct stat my_stat; 

int searchDirectory (char *dirName); 

int searchDirectory(char *dirName){ 
    struct dirent *pDirent; 
    DIR *pDir; 

    pDir = opendir(dirName); 
    if (pDir == NULL) { 
     printf("Cannot open directory '%s'\n", dirName); 
     return 1; 
    } 

    while ((pDirent = readdir(pDir)) != NULL){ 
     printf("%s\n", pDirent->d_name); 
     stat(pDirent->d_name, &my_stat); 
     if (S_ISDIR(my_stat.st_mode)){ 
      searchDirectory(pDirent->d_name); 
      printf("Directory Found: %s\n", pDirent->d_name); 
     } 
    } 

    return 0; 
} 

int main(int argc, char *argv[]){ 
    struct stat my_stat; 


    if (lstat(argv[1], &my_stat) < 0){ 
     perror("stat error"); 
    } 

    if (S_ISDIR(my_stat.st_mode)){ 
     printf("Directory found\n"); 
     searchDirectory(argv[1]); 
    } 

    return 0; 
} 

nedense benim kod bir dizin gibi normal dosyaları okuma neden ama emin değilim, ama S_ISDIR (my_stat.st_mode)) Bunu önlemek olmalıdır: Şimdiye kadar bu çalıştılar. Neyin yanlış olabileceği hakkında bir fikrin var mı?

+0

Ve sizin çıktınız nedir? Temel printf hata ayıklama işlemini yaptınız mı? –

+1

Bu yinelenen bir sorudur - zorluk, her zaman olduğu gibi, bir kopyası olduğu sorusunu bulmaktır. –

+0

@JonathanLeffler no problemo: Tam başlığın aranması: 'Yaklaşık 511.000 sonuç', ilk sayfada SO Q & A ile. –

cevap

2

Yapmakta olduğunuz sorun, işlemi başlattığınız bir çalışma dizinine sahipken, şu anda listelemekte olduğunuz dizinin pDirent->d_name dizinine göre olmasıdır. düzeltmek için

, kodunuz aksi sonsuz içinde sona erecek gibi özel durumlarda olarak . ve .. dizinleri işlemek gerektiğini,

int searchDirectory(char *dirName){ 
    ...... 
    while ((pDirent = readdir(pDir)) != NULL){ 
     printf("%s\n", pDirent->d_name); 
     stat(pDirent->d_name, &my_stat); 
     if (S_ISDIR(my_stat.st_mode)){ 
      // construct new path .... 
      char * dirname = malloc(strlen(dirName)+strlen(pDirent->d_name)+2); 
      strcat(strcat(strcpy(dirname,dirName),"/"),pDirent->d_name); 
      searchDirectory(dirname); 
      free(dirname) 
      printf("Directory Found: %s\n", pDirent->d_name); 
     } 
    } 
    ..... 

Ayrıca dikkat opendir yapmadan önce dizinin adlarını concatename o işlemek için ekstra kod gerekir böylece tekrarlama, - Eğer ayrıştırma dizine bir ad akrabası var çünkü dizinin adını hem bitiştirmek gerekir böylece ayrıntılar

için this question bkz
+0

Şüpheli OP aynı zamanda "pDirent-> d_name", "". "Ve" ".." ile yineleme sorunu yaşayacaktır. – chux

+0

Teşekkürler - Yanıtı dikkatle ekledi – Soren

1

searchDirectory(pDirent->d_name); Senin özyinelemeli çağrı, yanlış sen hareketlisin ally ayrıştırma ve göreli (bu dizin için) adınız var:

char newDir[PATH_MAX]; 
snprintf(newDir,PATH_MAX,"%s/%s",dirName,pDirent->d_name); 
searchDirectory(newDir); 
+1

Daha iyi kullanım 'snprintf'. – Chnossos

+0

@Chnossos Detay: 'snprintf()' sonucunu kontrol etmeden "snprintf()" işlevini kullanarak bir problemi çözebilir, ancak başka bir "searchDirectory" (newDir) olarak açabilirsiniz; "şaşırtıcı sonuçlara (açık hata, sonsuz yineleme, vb.) Sahip olabilir. .) – chux

İlgili konular