2010-12-29 3 views
18

파일이 있는지 또는 디렉토리인지 확인하는 프로그램을 작성 중입니다. 이보다 더 좋은 방법이 있을까요?파일이 디렉토리인지 또는 파일인지 확인

#include <stdio.h> 

#include <sys/types.h> 
#include <dirent.h> 
#include <errno.h> 

int isFile(const char* name) 
{ 
    DIR* directory = opendir(name); 

    if(directory != NULL) 
    { 
    closedir(directory); 
    return 0; 
    } 

    if(errno == ENOTDIR) 
    { 
    return 1; 
    } 

    return -1; 
} 

int main(void) 
{ 
    const char* file = "./testFile"; 
    const char* directory = "./"; 

    printf("Is %s a file? %s.\n", file, 
    ((isFile(file) == 1) ? "Yes" : "No")); 

    printf("Is %s a directory? %s.\n", directory, 
    ((isFile(directory) == 0) ? "Yes" : "No")); 

    return 0; 
} 

답변

36

당신은 stat() 함수를 호출 위해 stat 구조의 st_mode 필드에 S_ISREG() 매크로를 사용할 수 있습니다 다음 stat 또는 fstat 기능

+4

symlink 경우를 고려할 때 symlink를 따르지 않으므로 stat() 대신 lstat()를 사용하십시오. – Sparky

+3

[디렉토리가 존재하는지 확인] (http://stackoverflow.com/questions/3828192/checking-if-a-directory-exists-in-unix-system-call/)에서 적어도 좋은 토론이 있습니다. 여기서' stat()'와'lstat()'에 대해 논의하고 POSIX 파일 타입의 전체 집합을 개괄적으로 설명합니다. 나는 그 질문에이 질문을 반복하려는 유혹을 받는다. 코드는'stat()'의 결과도 검사하고 에러를 적절히 처리해야합니다. –

+0

@Jonathan, 그 답변은 실제로 내 것보다 더 완전하며, 5 년 전 나의 3 개월 전에 게시되었습니다. 그리고 내 자신의 대답은 어쨌든 사라질 것 같지 않습니다. 나는 당신이'[c]'태그로 Mjölnir을 사용하는 것을 보았습니다. 그래서 일방적으로 행동하기 전에 주석을 주셔서 감사합니다. 그러나, 당신은 궁극적으로 옳습니다. 걱정할 필요가 없습니다. –

4

예. 경로 포인트를 결정하는

int isDirectory(const char *path) { 
    struct stat statbuf; 
    if (stat(path, &statbuf) != 0) 
     return 0; 
    return S_ISDIR(statbuf.st_mode); 
} 
14

S_ISDIR 매크로를 사용 확인

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

int is_regular_file(const char *path) 
{ 
    struct stat path_stat; 
    stat(path, &path_stat); 
    return S_ISREG(path_stat.st_mode); 
} 

참고 다른 파일 형식 REGULA 외에 있다는 것을 : 일반 파일에 장치, 파이프, 심볼 링크, 소켓 등과 같이 r디렉토리 등을 고려해야합니다.

+0

정보로'statbuf' 구조체를 채우는 것을 잊었습니다. – RedX

+1

이것은 잘 작동하지만 stat 함수는 정보 자체를 채 웁니다. – ismail

+2

이상적으로, 코드는'stat'가 작동하는지 확인합니다 :'if (stat (path, & statbuf)! = 0) return 0;'- 존재하지 않는 객체가 디렉토리가 아니기 때문에, 'stat()'에 대한 허가권을 가지고 있다면,보고 된 에러가 허가와 관련되어 있다고해도 그것이 존재하지 않을 수도있다. –

1

일반적으로 결과를 사용하여 원자 적으로이 검사를 수행하려고하므로 stat()은 쓸모가 없습니다. 대신 open() 파일을 먼저 읽기 전용으로 설정하고 fstat()을 사용하십시오. 디렉터리 인 경우 fdopendir() 을 사용하여 읽을 수 있습니다. 또는 쓰기 시작을 위해 열어 볼 수도 있으며, 디렉토리이면 열기가 실패합니다. 일부 시스템 (POSIX 2008, Linux)은 open에 대한 O_DIRECTORY의 확장자를 가지므로 이름이 디렉토리가 아닌 경우 호출이 실패합니다.

opendir()을 사용하는 방법은 디렉토리를 원한다면 좋지만 나중에 닫지 마십시오. 계속해서 사용하십시오.

관련 문제