2009-10-30 228 views
28

我想打開一個文件進行讀取。但是,在這個程序的上下文中,如果文件不存在,我就繼續。我希望能夠識別何時出現錯誤「文件未找到」以及何時出錯。否則意味着我需要退出並出錯。ifstream:如何判斷指定文件是否存在

我沒有看到一個明顯的方式與fstream做到這一點。


我可以做到這一點C'S open()perror()。我推測有一個fstream的方式來做到這一點。

回答

5

由於打開文件的結果和具體的操作系統,我不認爲標準C++有任何方法來區分各種類型的錯誤。該文件可以打開或不打開。

您可以嘗試打開文件進行閱讀,如果文件未打開,您知道它不存在或發生其他錯誤。然後再次,如果您嘗試打開後繼寫入而失敗,則可能屬於「其他」類別。

36

我不認爲你可以知道「該文件不存在」。你可以使用IS_OPEN()爲通用檢查:

ofstream file(....); 
if(!file.is_open()) 
{ 
    // error! maybe the file doesn't exist. 
} 

如果您正在使用boost你可以使用boost::filesystem

#include <boost/filesystem.hpp> 
int main() 
{ 
    boost::filesystem::path myfile("test.dat"); 

    if(!boost::filesystem::exists(myfile)) 
    { 
     // what do you want to do if the file doesn't exist 
    } 
} 
+6

它不是正流,而是流! – Phong 2010-10-15 05:30:42

+0

請注意,這兩種方式檢查別的東西:該文件可能在那裏,但你可能沒有必要的權限... – rubenvb 2013-10-24 15:00:25

+3

這不是一個本質上激烈的解決方案? – 2014-04-15 09:03:54

5

您可以使用統計,這應該是跨平臺移植,是在標準C庫:

#include <sys/stat.h> 

bool FileExists(string filename) { 
    struct stat fileInfo; 
    return stat(filename.c_str(), &fileInfo) == 0; 
} 

如果stat將會返回0,文件(或目錄)存在,否則就沒有。我假設你必須擁有文件路徑中所有目錄的訪問權限。我沒有測試可移植性,但this page表明它不應該是一個問題。

+0

應明確檢查返回碼,因爲除文件以外的原因,它可能不爲零。見http://pubs.opengroup.org/onlinepubs/009695399/functions/stat.html – gerardw 2013-10-11 12:04:00

+2

這是一個錯誤的事情,因爲在AFTER返回的時間和之前'fstream'的open()得到實際上打開文件的文件可能已經不存在了(被系統中的另一個進程刪除)。 – PowerGamer 2015-01-05 12:11:55

+0

http://stackoverflow.com/questions/12774207/fastest-way-to-check-if-a-file-exist-using-standard-c-c11-c – Ethan 2016-02-16 03:30:33

39

編輯:我已收到通知,這並不一定表示文件不存在,因爲它可能會由於訪問權限或其他問題而被標記。

我知道我在回答這個問題時非常遲,但我想我會留下一條評論,無論如何,任何人瀏覽。您可以使用ifstream的失敗指示器來判斷文件是否存在。

ifstream myFile("filename.txt"); 
    if(myFile.fail()){ 
     //File does not exist code here 
    } 
//otherwise, file exists 
+2

感謝您的「遲到」答案!我發佈它非常有用;) – ezdazuzena 2013-04-05 10:23:46

+0

非常有用!非常感謝 – 2014-08-22 13:42:42

+2

你的建議不是檢查「文件未找到」的方法。 'fail()'不表示「文件不存在」,它只是表示「有問題」。在你的特定例子中,它可以是「拒絕訪問」或「共享違規」等。 – PowerGamer 2015-01-05 12:18:16

0

功能std::fstream::good()返回false當文件不存在。這還不夠嗎?

std::fstream繼承此功能從std::ios

相關問題