2012-02-16 8 views
20

opendir 함수를 사용하여 디렉토리가 존재하는지 확인합니다. 문제는 방대한 루프에서 사용하고 있으며 앱에서 사용하는 RAM을 부 풀리는 것입니다.C 디렉토리가 있는지 확인하는 더 빠른 방법

디렉토리가 C에 있는지 확인하는 가장 빠른 (가장 빠른) 방법은 무엇입니까? 그것이 없으면 가장 좋은 (가장 빠른) 방법은 무엇입니까?

+7

바보 같은 질문입니다. 이후에 closedir()을 호출합니까? – user7116

+0

더 빠른 방법은 비동기 적으로 수행하는 것이지만 미디어의 기능을 고려해야합니다. 그것이 일반 HDD 인 경우 탐색 폭풍으로 실패 할 수 있으며 느리게 작동합니다. 그러나 RAID/SSD를 사용하거나 클라우드에서 작업하는 경우에도 정상적으로 작동합니다. – LiMar

답변

16

mkdir()으로 전화 할 수 있습니다. 디렉토리가 존재하지 않으면 디렉토리가 작성되고 0이 리턴됩니다. 디렉토리가 존재하면 -1이 리턴되고 errnoEEXIST으로 설정됩니다.

+2

경로를 따라 무언가가 존재하지 않는다면 'ENOENT'가 발생할 수 있다는 경고가 있습니다. – user7116

+0

참. 언급 했어야했다. – ckruse

+2

통계보다 빠릅니다. –

2

가능한 경우 stat()을 사용합니다.

39

stat을 사용해보십시오. S_ISDIR(s.st_mode)이 디렉토리인지 알려줍니다.

샘플 : 메모리 누수가 같은

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

... 
struct stat s; 
int err = stat("/path/to/possible_dir", &s); 
if(-1 == err) { 
    if(ENOENT == errno) { 
     /* does not exist */ 
    } else { 
     perror("stat"); 
     exit(1); 
    } 
} else { 
    if(S_ISDIR(s.st_mode)) { 
     /* it's a dir */ 
    } else { 
     /* exists but is no dir */ 
    } 
} 
... 
+1

얼마나 빨리 opendir과 비교합니까? –

+3

운영 체제 및 상위 디렉토리에있는 항목 수에 따라 다릅니다. 그것은 어떤 식 으로든 더 빠를 것이고 그것은 바로'stat'를위한 것입니다. –

+0

Linux 64 비트, 1 항목 –

0

소리가 난다. opendir을 호출하면 디렉토리를 성공적으로 연 후에 항상 closedir을 호출하는 것을 기억하는 한 앱의 RAM을 부풀려서는 안됩니다. 또한 디렉토리 이름을 계산하기 위해 할당 한 버퍼를 해제해야합니다.

+0

Yeap 나는 그것을 닫고있다, 나는 통계를 사용하겠다. 시간 내 주셔서 감사합니다! –

16

난 당신이 디렉토리 이름에 후행 /을 확인하면 access()

if (0 != access("/path/to/possible_dir/", F_OK)) { 
    if (ENOENT == errno) { 
    // does not exist 
    } 
    if (ENOTDIR == errno) { 
    // not a directory 
    } 
} 

를 사용하여 선호하는이 완벽하게 작동합니다.