2017-11-16 6 views
-1

현재 디렉토리와 일반 파일을 구별 할 필요가있는 일종의 재귀 적 찾기를 수행하려고합니다. 주어진 파일이 디렉토리이지만/home에 적용될 때 S_ISDIR을 사용하여 루프를 만들었는데 예상 한 결과를 얻지 못했습니다.디렉토리의 다른 값을 반환하는 S_ISDIR

/home/. 
/home/.. 
/home/pome 

을하지만, 디렉토리, S_ISDIR()에 대한 이과 0과 1을 반환로 이과를 감지하지 않습니다 난 단지 때문에 예상 된 결과가 될 것이다에서/집 이과 디렉토리가 있습니다. 와 ..

코드 :

DIR * dir = opendir("/home"); 
if(dir==NULL){ 
    puts("Unknown directory"); 
    return 1; 
} 
char path[SIZE_PATH]; 
memset(path,'\0',sizeof(path)); 
strcpy(path,"/home"); 
struct dirent * trucdir; 
char filename[SIZE_PATH]; 
memset(filename,'\0',sizeof(filename)); 
struct stat * filestat=malloc(sizeof(struct stat)); 
while((trucdir=readdir(dir))!=NULL){ 
    memset(filename,'\0',sizeof(filename)); 
    strcpy(filename,trucdir->d_name); 
    stat(filename,filestat); 
    if(S_ISDIR(filestat->st_mode)!=0){ 
     puts(filename); 
    } 
} 

이 파일이 디렉토리 인 경우 영이 아닌 값을 반환하기로 S_ISDIR되지 않는 이유는 무엇입니까?

+0

문제와 관련이 없지만 함수가 포인터를 예상한다고해서 동적으로 할당해야하는 것은 아닙니다. 'struct stat'와'stat' 함수를 사용하는 경우에는'struct stat filestat;'와'stat (filename, & filestat);를 사용하면됩니다. –

+1

'stat()'호출이 어떻게 작동했는지 어떻게 알 수 있습니까? –

+0

문제에 관해서는'opendir'에 전달 된 경로와'readdir'에 의해 주어진 이름을 연결하는 것을 잊어 버립니다. 또한'stat'가 반환하는 것을 확인하면'-1'을 반환하고'errno'를'ENOENT'로 설정할 것입니다. 이 문제는 [프로그램 디버깅 방법을 알고 있다면] 분명해야합니다 (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). –

답변

2

stat() -call 실제로 이 반환 값을 확인하여을 성공했는지 확인해야합니다.

stat("pome", filestat); 

하지만 현재 작업 디렉토리 (CWD) 는 아니다/홈 : 귀하의 경우, 통계에 대한 호출입니다!

따라서 stat에 대한 호출은 -1으로 실패하고 errno ENOENTIS_DIR -macro는 의미가 없습니다. 그들은 모든 디렉토리에 존재하기 때문에 당신은 당신이 제공하거나 있는지 확인해야합니다

를 (등 아이 노드 번호와 같은 기타 정보는 다음과 일치하지 않지만) . 물론 ..에 STAT-통화 성공 filename (즉, /home/pome) 또는 cwd를/home 앞에 (chdir("/home");) 설정하십시오. 이것은 당신의 문제를 해결해야합니다!

+0

'chdir()'을 사용하는 것을 조심하십시오. 필요한 경우 되돌릴 수 있습니다. 되돌리려면'fchdir()'을 사용하고'chdir()'을 사용하기 전에 디렉토리를 열어'fchdir()'을 사용하여 돌아갈 수 있도록하십시오. 단일 디렉토리를 처리 한 후에 응용 프로그램이 종료되면'chdir()'이 정상입니다. 프로그램에 대한 10 가지 인수를 각각 처리해야하고 인수 중 일부가 절대 경로가 아닌 상대 경로 인 경우 시작한 곳으로 돌아갈 염려가 필요합니다. 그러나 이것은 좋은 대답에 관한 해설이다. 문제는'stat()'가 실패한다는 것이다. –