2012-12-19 4 views
7

가능한 중복 :
What’s the best way to check if a file exists in C? (cross platform)C, 읽기/쓰기가 불가능한 파일이 있는지 확인하십시오.

난 파일이 존재 아닌지 확인하고 싶습니다. 내 테스트 파일의 권한을 "chmod -r somefile"으로 변경했습니다. 그러나 현재 파일이 존재한다고해도 존재하지 않는다고합니다.

그래서 내가 "fopen r"로 파일을 열 수없는 사용 권한을 읽지 않는다고 가정합니다. 그렇다면 파일이 있는지 또는 읽거나 쓸 수 없는지를 쉽게 알 수있는 방법이 없다는 뜻입니까?

아니면 뭔가 빠졌습니까? 어떤 도움이라도 좋을 것입니다.

감사합니다.

int doesFileExist(const char* filename) 
{ 
    FILE* fptr = fopen(filename, "r"); 
    if (fptr != NULL) 
    { 
    fclose(fptr); 
    printf("File exists\n"); 
    return 1; 
    } 
    printf("File doesnt exist\n"); 
    return 0; 
} 

업데이트 : 멋진 링크와 설명을 보내 주셔서 감사합니다.

+1

음 ..'errno'를 확인 했습니까? 편집 : 일부 오류 메시지를 얻으려면이 시도하십시오.'printf ("파일이 없습니다 : % s \ n", strerror (errno));''errno.h '헤더를 포함하는 것을 잊지 마십시오. – Jack

+0

이것은 stdio API에 대해 싫어합니다. 파일 크기를 조정하거나 이전의 파일을 복사하거나 삭제하지 않고 파일을 옮기는 등의 작업을 수행해야 할 때마다 이식성 측면에서 운이 좋지 않습니다. – Thomas

답변

18

fopen은 실제로 파일을 열려고 시도하며, 읽기 권한이없는 경우에는 수행 할 수 없습니다. 파일을 열지 않고 파일이 존재하는지 확인하려면 stat; stat은 파일에 대한 메타 데이터를 제공하며 파일 자체가 아니라 파일이 들어있는 디렉토리에 대한 읽기 액세스 만 필요합니다.

int doesFileExist(const char *filename) { 
    struct stat st; 
    int result = stat(filename, &st); 
    return result == 0; 
} 

당신은 0이 아닌 errnoresult 경우 확인하여 애호가 얻을 수; errnoENOENT 인 경우 파일이 존재하지 않습니다. ENOTDIR 인 경우 입력 한 경로의 일부가 디렉토리가 아니며 EACCESS 인 경우 경로의 디렉토리 중 하나에 대한 읽기 권한이 없으므로 stat 수 있습니다 당신에게 답을주지 마세요.

심볼릭 링크 (Unix 계열 또는 Windows Vista 이상)가있는 플랫폼을 사용하는 경우 심볼릭 링크 또는 해당 파일이 가리키는 파일에 대해 쿼리하고 있는지 여부를 알고 있어야합니다 . stat으로 전화하면 해당 파일이 가리키는 파일에 대해 묻습니다. other/file을 나타내는 dir/link의 심볼릭 링크가있는 경우 statother/file에 대한 결과를 반환합니다 (파일을 열었을 때 얻을 수있는 것이므로 일반적으로 원하는 것입니다).그러나 링크 자체에 대해 궁금하다면 (dir/link이 있습니까, other/file이 없더라도?), lstat()을 사용해야합니다.

stat()은 호환성 래퍼로 Windows에서 작동하며 (사용자가 _stat()을 사용하고 그렇지 않은 경우 경고합니다) 일반적으로 기본 플랫폼 API를 사용하는 것이 좋습니다. Windows에서 GetFileAttributes() :

int doesFileExist(const char *filename) { 
    return GetFileAttributes(filename) != INVALID_FILE_ATTRIBUTES; 
} 
-1

Linux (및 많은 다른 시스템)에서는 opendir() 및 친구를 사용하여 디렉토리를 나열 할 수 있습니다. 나는 읽기 전용 파일이 나타날 것 같아요. 다른 플랫폼에서 사용할 수있는 유사한 기능이 있어야합니다.

1

파일이 실제로 있는지 여부를 확인하지 않고 있습니다 ... 읽기 액세스 권한으로 파일을 열 수 있는지 확인하고 있습니다. 파일이 아닌 다른 이유로 인해 실패 할 수 있습니다. 이전에 보았 듯이 읽기 권한이 없을 수도 있습니다. 파일이 잠겨있을 수도 있습니다.

확인이 답변 :

What's the best way to check if a file exists in C? (cross platform)

그것은 당신이 파일이있는 디렉토리에 대한 읽기 권한이없는 경우를 제외하고 대부분의 경우에 작동합니다 stat를 사용하여 제안합니다.

관련 문제