2016-10-30 11 views
0

サブディレクトリであるエントリを無視する必要があります。どうすればいい?私はS_ISDIR(s.st_mode)を使用しなければならないと思うが、どうすればいいのかわからない。私を助けてくれますか?ここでlinuxのディレクトリエントリを列挙するときにサブディレクトリを無視する方法C

が私のコードです:

void recorrer_directorio(char *dir_name) { 
    DIR *dir = NULL; 
    struct dirent *ent; 
    char fich[1024]; 
    char buff[4096]; 
    int fd; 

    /* OPEN DIRECTORY */ 
    /*ESTO ES MI CODIGO*/ 
    dir = opendir(dir_name); 

    /* TREATMENT OF ERROR */ 
    if (dir == NULL) { 
     printf("aqui esta mi error"); 
     perror("Recorrer_Directorio : opendir()"); 
     exit(1); 
    } 

    while ((ent = readdir(dir)) != NULL) { 
     /* Nos saltamos las que comienzan por un punto "." */ 
     if (ent->d_name[0] == '.') 
      continue; 

     /* PATH OF FILE*/ 
     realpath(ent->d_name, fich); 
     printf("MI RUTA COMPLETA DE FCHERO [%s]\n", fich); 

     /* IGNORE DIRECTORY PATH */ 
     .......... 
    } 
}    
+0

通常のファイルは '.'で始まることがありますが、無視するとOKではない可能性があります。あなたは "を確認することができます。"と ".."を明示的に指定する必要がありますが、他のエントリーには一般的な解決策が必要です。 – chqrlie

+0

また、 'realpath'をこのように使用しないでください:現在のディレクトリに対してのみ動作します。 P.P.に示唆されている連結を使用してください。必要ならば、結果のバッファに 'realpath'を使います。 – chqrlie

+0

最後に、貴重なハンドルが漏れないように 'closedir()'を忘れないでください。 – chqrlie

答えて

1

それはあなたのシステムでサポートされます場合は、ファイルタイプを取得するためにd_typeを使用することができます。

if (ent->d_type == DT_DIR) { 
    /* ent->d_name is a directory. */ 
} 

そうでない場合は、次のようにstat(2)使用することができます。

#include <sys/types.h> 
#include <sys/stat.h> 
#include <unistd.h> 

... 

char buf[4096]; 
snprintf(buf, sizeof buf, "%s/%s", dir_name, ent->d_name); 
struct stat sb; 

if (stat(buf, &sb) == 0 && S_ISDIR(sb.st_mode)) { 
    /* d_name is a directory. */ 
} 
+0

ありがとう!私は統計を使用しようとしていたが、ライブラリのためにできなかった – guille

関連する問題