2017-06-05 70 views
0

編輯:這個問題不是我的C++。問題在於我在GameMaker Studio中如何調用共享庫,這就是爲什麼它不起作用。如何檢查文件是否存在(不管其文件類型)?

我試圖檢測一個文件是否存在,並且我已經在互聯網上嘗試了很多方法,並且它們都沒有工作。這裏有一個例子:

double file_exists(char *filename) 
{ 
    std::ifstream infile(filename); 
    return infile.good(); 
} 

我認爲它只會使用文本文件。例如,這不起作用:

file_exists("/usr/bin/gedit"); 

...因爲這是一個Linux可執行文件。

我想要一種方法來檢查文件是否存在,而不管它的文件類型如何。

在Windows,這很容易實現,像這樣:

double file_exists(char* filename) 
{ 
    DWORD fileAtt = GetFileAttributesA(filename); 
    if(fileAtt == INVALID_FILE_ATTRIBUTES) 
     throw GetLastError(); 

    return (bool)((fileAtt&FILE_ATTRIBUTE_DIRECTORY) == 0); 
} 

但我在Linux上,我需要上面的代碼中,將工作在Linux上的等效。

+4

['stat'](http://man7.org/linux/man-pages/man2/stat.2.html)或['access'](http://man7.org/linux /man-pages/man2/access.2.html)是兩個可以使用的POSIX函數。或者使用[Boost文件系統](http://www.boost.org/doc/libs/1_64_0/libs/filesystem/doc/index.htm)或即將推出的[標準文件系統庫](http://en.cppreference。 COM/W/CPP /文件系統)。 –

+0

此外,使用C++流打開文件時,系統不關心其「文件類型」。文件是文件是文件...「文本」文件只是應用程序解釋內容的一種方式,流本身並不真正關心內容。 –

+0

你的例子適用於''/ usr/bin/gedit'' – Galik

回答

1

在Linux中你有stat()系統調用:

struct stat st; 
int res = stat(filename, &st); 
bool exists = res == 0; 

如果你想要更多的技巧,你可以檢查errno如果res非零:

if (res == 0) 
    return true; 
if (errno == ENOENT) 
    return false; 
throw errno; //you're throwing an int, aren't you? 

此外,作爲獎金,如果你想知道它是一個目錄還是一個普通的文件,或者一個fifo或一個套接字或一個設備......你可以檢查st.st_mode的內容。

+1

而不是直接拋出'errno',我建議你使用['std :: system_error'](http://en.cppreference。com/w/cpp/error/system_error)(例如,請參閱[我的舊回答](https://stackoverflow.com/a/12171615/440558))。 –

+0

我通常會拋出'std :: runtime_error(std :: strerror(errno));'得到一個有用的消息 – Galik

+0

這一切都很好。我只是因爲OP直接拋出'GetLastError()'而拋出'errno'。 – rodrigo

0

如果你是Linux然後GCC實現文件系統技術規範,很快被列入C++17。您可以使用std::filesystem::exists

#include <experimental/filesystem> 

namespace fs = std::experimental::fileystem; 

int main() 
{ 
    if(fs::exists("/usr/bin/gedit")) 
    { 
     // use file here 
    } 
} 
相關問題