2010-04-16 3 views

답변

1

당신은 lstat를 사용하여 감사 및 매크로 S_ISDIR.

예. 오류 검사없이 :

struct stat buffer; 
int status; 
char path[PATH_MAX]; 
DIR *dir = opendir(dir_name); 
... 
struct dirent *de = readdir(dir); 
sprintf(path, "%s/%s", dir_name, de->d_name); 
status = lstat(path, &buffer); 
if(S_ISDIR(buffer.st_mode)) 
{ 
    ... 
} 

편집 : lstat 경로 (el.pescado)의 디렉토리를 포함하도록 수정되었습니다. R Samuel Klatchko가 지적한 바와 같이, 유형이 올라올 때 블랙리스트 대신 화이트리스트 접근 (S_ISREG)을 원할 수 있습니다.

+0

경로를 lstat에 전달하기 전에 dirname과 filename을 결합해야합니다 (예 : sprintf (경로, "% s/% s", dir_name, de-> d_name); –

+1

디렉토리 엔트리 ('S_ISDIR')를 제외하는 것보다는 정규 파일 엔트리 ('S_ISREG') 만 처리하는 것이 좀 더 견고합니다. 그렇게하면 다른 유형의 항목을 실행하면 실수로 처리하지 않습니다. –

+0

그리고 다른 것을 알아 챘습니다. 'stat' 또는'lstat'를 사용할 지에 대해 생각할 필요가 있습니다. 실제 파일에 대한 심볼릭 링크가있는 경우 처리하거나 건너 뛰시겠습니까? 그것을 건너 뛰고 싶다면,'lstat'을 사용하여 심볼릭 링크임을 알 수 있습니다. symlink에 대해 신경 쓰지 않고 일반 파일에 대한 심볼릭 링크라고 가정하고 처리하고 싶다면'stat'를 사용하십시오. –

0
`void DirectryNFileCount(const char * FileDir) 
{ 
    DIR *dir; 
    int filecount; 
    int dircount; 
    struct dirent *direntry; 
    if ((dir = opendir (FileDir)) == NULL) 
    { 
    /*Error code*/ 
    } 
while((direntry = readdir (dir)) != NULL) 
{ 
if(direntry->d_type==DT_DIR) 
dircount++; 
/*do something with directries  */ 
} 
else 
{ 
    filecount++; 
    std::cout<<"Files Names"<<direntry->d_name<<std::endl; 
} 
} 
    std::cout<<"THIS Directory has "<<filecount<<" FILES and "<<dircount<< " DIRECTORIES"; 
} 
+1

코드에 수반되는 서면 설명이 도움이 될 것입니다. – nbryans

관련 문제