C ++에 파일이 있는지 확인하는 가장 좋은 방법은 무엇입니까? (크로스 플랫폼)


97

C에 파일이 있는지 확인하는 가장 좋은 방법무엇입니까?에 대한 답변을 읽었습니다 . (크로스 플랫폼) ,하지만 표준 C ++ 라이브러리를 사용하여이 작업을 수행하는 더 좋은 방법이 있는지 궁금합니다. 파일을 전혀 열지 않는 것이 좋습니다.

모두 stataccess거의 ungoogleable 있습니다. 이것을 어떻게 사용해야 #include합니까?


액세스 용 <io.h> (실제로는 _access 일 수 있음).
Rob 2011

예, 여기서 지적했듯이.
c0m4

답변:


170

사용 부스트 : : 파일 시스템 :

#include <boost/filesystem.hpp>

if ( !boost::filesystem::exists( "myfile.txt" ) )
{
  std::cout << "Can't find my file!" << std::endl;
}

68
단순 해야하는 작업을 수행하기 위해 거대한 타사 라이브러리를 설치하는 것은
다소 혼란스러운 것 같습니다.

89
Boost는 결국 C ++ 표준 라이브러리의 일부가 될 많은 것이 개발되는 라이브러리입니다. Boost와 관련된 많은 사람들은 C ++ 표준에 관련된 사람들입니다. 그래서 부스트는 아닙니다 어떤 타사 라이브러리입니다. 당신은 C로 프로그래밍하는 경우 ++ 당신이 해야 부스트가 설치되어!
Andreas Magnusson

b :: fs :: exists가 네트워크 공유에 존재하지 않는 파일에 대해 "true"를 반환한다는 것을 기억하는 것 같습니다 : "\\ machine \ share \ this_file_doesnt_exist"=> true. 마지막으로 확인한 시간은 부스트 ​​1.33입니다.주의하십시오 ...
rlerallut

컴파일러가 tr1 구현과 함께 제공되는 경우 Boost를 설치할 필요도 없습니다. std :: tr1 :: filesystem
Nemanja Trifunovic

1
실제로 ASFAIK는 TR1을 만들지 않았지만 나중에 추가 될 것입니다. 공식 TR1 초안에서도 언급 된 내용을 찾지 못했습니다. open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1836.pdf
Andreas Magnusson

41

경합 상태에주의하십시오. "존재"확인과 파일을 여는 시간 사이에 파일이 사라지면 프로그램이 예기치 않게 실패합니다.

가서 파일을 열고 실패를 확인한 다음 모든 것이 정상이면 파일로 무언가를하는 것이 좋습니다. 보안에 중요한 코드에서는 훨씬 더 중요합니다.

보안 및 경쟁 조건에 대한 세부 사항 : http://www.ibm.com/developerworks/library/l-sprace.html


30

나는 행복한 부스트 사용자이며 확실히 Andreas의 솔루션을 사용할 것입니다. 그러나 부스트 라이브러리에 액세스 할 수없는 경우 스트림 라이브러리를 사용할 수 있습니다.

ifstream file(argv[1]);
if (!file)
{
    // Can't open file
}

파일이 실제로 열리기 때문에 boost :: filesystem :: exists만큼 좋지는 않지만 일반적으로 어쨌든 다음 작업을 수행합니다.


15
그러나이 코드를 사용하면 파일에 대한 권한이없는 경우에도 if 절로 이동할 수 있습니다. 대부분의 경우 중요하지 않지만 언급 할 가치가 있습니다.
scigor

1
주어진 인수가 디렉토리를 나타내는 경우에도 good ()이 true를 산출합니다. stackoverflow.com/questions/9591036/…
FelixJongleur42

12

필요에 따라 충분히 크로스 플랫폼 인 경우 stat ()를 사용하십시오. 그래도 C ++ 표준은 아니지만 POSIX입니다.

MS Windows에는 _stat, _stat64, _stati64, _wstat, _wstat64, _wstati64가 있습니다.


1
<sys / types.h> 및 <sys / stat.h> 참조 msdn.microsoft.com/en-us/library/14h5k7ff(VS.71).aspx
activout.se

1
과잉이기 때문에 NOT USING BOOST에 대한 좋은 답변 +1 이지만 여기에 제공된 내용에서 작성하는 것이 사소한 것이 아니기 때문에 방금 답변을 게시했습니다. 확인해주세요.
gsamaras jul.

9

어때요 access?

#include <io.h>

if (_access(filename, 0) == -1)
{
    // File does not exist
}

io.h는 표준이 아니더라도 Windows와 Linux에서 정상적으로 사용할 수 있습니까?
c0m4

1
access ()는 Linux에서 <unistd.h>를 통해 사용할 수있는 POSIX 함수입니다.
Alex B

9

또 다른 가능성은 good()스트림 에서 함수 를 사용하는 것입니다.

#include <fstream>     
bool checkExistence(const char* filename)
{
     ifstream Infield(filename);
     return Infield.good();
}

7

파일이 존재하는지 알아 내려고 재검토 할 것입니다. 대신 사용하려는 것과 동일한 모드에서 (표준 C 또는 C ++에서) 열어야합니다. 파일을 사용해야 할 때 쓸 수없는 경우 파일이 존재한다는 것을 아는 것은 무슨 소용입니까?


ls유사 프로그램을 작성한다면 어떨까요? 여기에있는 원본 포스터는 파일을 전혀 열지 않는 것 같습니다. Posix의 stat 함수는 파일의 권한에 대한 정보를 제공하므로 해당 문제를 해결할 수 있습니다.
Michael

6

컴파일러가 C ++ 17을 지원하는 경우 부스트가 필요하지 않습니다. std::filesystem::exists

#include <iostream> // only for std::cout
#include <filesystem>

if (!std::filesystem::exists("myfile.txt"))
{
    std::cout << "File not found!" << std::endl;
}

3

아니 REQUIRED과잉 일 것 입니다.


다음과 같이 stat () (pavon에서 언급 한 것처럼 교차 플랫폼이 아님)을 사용하십시오.

#include <sys/stat.h>
#include <iostream>

// true if file exists
bool fileExists(const std::string& file) {
    struct stat buf;
    return (stat(file.c_str(), &buf) == 0);
}

int main() {
    if(!fileExists("test.txt")) {
        std::cerr << "test.txt doesn't exist, exiting...\n";
        return -1;
    }
    return 0;
}

산출:

C02QT2UBFVH6-lm:~ gsamaras$ ls test.txt
ls: test.txt: No such file or directory
C02QT2UBFVH6-lm:~ gsamaras$ g++ -Wall main.cpp
C02QT2UBFVH6-lm:~ gsamaras$ ./a.out
test.txt doesn't exist, exiting...

다른 버전 (및 저것)은 여기 에서 찾을 수 있습니다 .


다운 보 터는 아니지만 질문은 크로스 플랫폼 솔루션을 요청했으며 모든 플랫폼에 통계가 존재하는 것은 아닙니다.
pavon

0

이미 입력 파일 스트림 클래스 ( ifstream)를 사용하고있는 경우 해당 함수를 사용할 수 있습니다 fail().

예:

ifstream myFile;

myFile.open("file.txt");

// Check for errors
if (myFile.fail()) {
    cerr << "Error: File could not be found";
    exit(1);
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.