2009-03-16 2 views
2

파일을 열 수 있는지 여부를 빠르게 확인하고 싶습니다. 그것은 포터블 C로 작성되거나 적어도 Win32 및 POSIX 시스템에서 작동해야합니다. #ifdefs는 허용됩니다. 나는이 문제를 방지하기 위해 노력하고있어휴대용 C를 사용하여 파일을 열 수 있는지 확인

:

나는 통계를() 무엇을 말할 수 실제로 개방의 경우, 가장 간단한 형태로, 파일이 존재하는지 점검 할 수는 있지만 확인되지에서
int openable(const char*filename) { 
    FILE *f = fopen(filename,"r"); 
    if (!f) 
     return 0; /* openable */ 
    fclose(f); 
    return 1; /* not openable */ 
} 

.

+0

코드는 그것을 할 수있는 더 많거나 적은 ANSI 방법, 그 문제에 불과하다. –

+0

... 그것은 느린 :) –

답변

3

POSIX 표준 용액은 _access()로 Windows 런타임도 access()이다.

나는 그것이가 두드러보다 나은 fopen() + fclose() 추측 이유는

그것은 그것은 매우 아마도 빠른
  • 액세스 권한에 대한 파일을 테스트하는 문제에 잘 알려진 표준 솔루션입니다
    • , 메모리 오버 헤드가 적습니다.

    물론 다른 테스트 방법과 마찬가지로 경쟁 조건에 취약합니다. 어떤 방식으로 파일을 읽을 수 있는지를 아는 유일한 안전한 방법은 파일을 열고 닫지 않고 읽으려고하는 것입니다. 그럼에도 불구하고, 당신은 여전히 ​​"예기치 않은"EOF를 볼 필요가 있습니다. I/O는 어렵습니다.

  • +0

    fopen()이 잘 열리는 파일조차도 setuid 프로그램의 파일에 액세스 할 수 없다는 사실을 access()에서 알 수 있습니다 : http://www.gnu.org/software/libtool/manual/libc/ Testing-File-Access.html – dmityugov

    +0

    감사합니다. 긴장을 풀지 마십시오. 액세스()에 대해 알지 못했습니다. 이것이 내가 찾고있는 것입니다. 경주 조건은 내가하는 일에 실제로 문제가되지 않습니다 :) dmityugov, 의견을 많이 주셔서 감사합니다, 이것에 대해 조심하겠습니다! –

    +1

    나는 원래의 솔루션이 실제로는 access()보다 바람직하다고 생각한다. access()는 fopen()/fclose()보다 약간 빠르지 만, access()가 실제로 가능한지 여부를 알려주지 않는 모든 종류의 가장자리 케이스 (setuid 또는 ACL 또는 경쟁 조건)가있을 수 있습니다. 파일을 읽는다. –

    1

    파일을 "열 수 있음"을 알기 전에 확인해야 할 여러 요소가 있으며, 플랫폼 간 방법으로 모두 확인하면 바보입니다.

    나는 지금 당신이하고있는 일이 간단하고 안전하다고 생각합니다. 그러나은 파일이 "개방형"이기 때문에 이 이제 일 때 실제로 열어 본다는 의미는 아닙니다. 그 동안에는 변경되지 않습니다.

    +0

    내 의견 그러나이 코드의 주요 구조 조정없이로드 될 설정 파일을 결정하는 대부분이다, 마이클의 응답 : –

    1

    나는 당신이해야하는 것은 아마도 (귀하의 의견은 그들이해야 것과 반대되는하지만) 당신이 얻을 것만큼이나 좋은 생각합니다. 권한 등 다른 뭔가가 열려 유지, 자원의 부족,

    정확하게이 모든 검사를 통과하려면, 당신은뿐만 아니라 그냥 일을 열 수 있습니다 많은 개방에서 파일을 방지 할 수있는 일이있다.

    그러나 대부분의 시스템에서 발신자에게 거짓말을하는 경우가 있습니다. 발신자에게 파일을 열 수 있는지 여부를 알리는 순간, 시스템이 변경 될 수 있습니다 (파일을 독점적으로 열어 놓으면 무언가를 닫을 수 있습니다). 따라서 응용 프로그램이 파일을 열고 사용할 수 있는지 여부를 알 수있는 유일하고 진정으로 효과적인 방법은 파일을 열고 사용하는 것입니다 (실패를 처리하는 것). 즉

    , 당신이 당신의 호출자에게 ' true'를 반환하는 경우, 그들은 파일을 열려고 할 수 있으며, 그것은 여전히 ​​실패 할 수 있습니다.

    +0

    덕분이다. 다행스럽게도 이것은 서버 실행 중 한 번만 작동하므로 실패하지는 않습니다. –

    +0

    예를 들어, 사용중인 ACL이있는 경우와 같이 'stat()'를 통해 파일에 대한 사용 권한을 확인하는 것이 좋을지라도 파일을 찾을 때까지 파일을 열 수 있는지 여부를 알 수 없습니다. –

    관련 문제