我想打開一個文件進行讀取。但是,在這個程序的上下文中,如果文件不存在,我就繼續。我希望能夠識別何時出現錯誤「文件未找到」以及何時出錯。否則意味着我需要退出並出錯。ifstream:如何判斷指定文件是否存在
我沒有看到一個明顯的方式與fstream
做到這一點。
我可以做到這一點C'S open()
和perror()
。我推測有一個fstream
的方式來做到這一點。
我想打開一個文件進行讀取。但是,在這個程序的上下文中,如果文件不存在,我就繼續。我希望能夠識別何時出現錯誤「文件未找到」以及何時出錯。否則意味着我需要退出並出錯。ifstream:如何判斷指定文件是否存在
我沒有看到一個明顯的方式與fstream
做到這一點。
我可以做到這一點C'S open()
和perror()
。我推測有一個fstream
的方式來做到這一點。
由於打開文件的結果和具體的操作系統,我不認爲標準C++有任何方法來區分各種類型的錯誤。該文件可以打開或不打開。
您可以嘗試打開文件進行閱讀,如果文件未打開,您知道它不存在或發生其他錯誤。然後再次,如果您嘗試打開後繼寫入而失敗,則可能屬於「其他」類別。
我不認爲你可以知道「該文件不存在」。你可以使用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
}
}
您可以使用統計,這應該是跨平臺移植,是在標準C庫:
#include <sys/stat.h>
bool FileExists(string filename) {
struct stat fileInfo;
return stat(filename.c_str(), &fileInfo) == 0;
}
如果stat將會返回0,文件(或目錄)存在,否則就沒有。我假設你必須擁有文件路徑中所有目錄的訪問權限。我沒有測試可移植性,但this page表明它不應該是一個問題。
應明確檢查返回碼,因爲除文件以外的原因,它可能不爲零。見http://pubs.opengroup.org/onlinepubs/009695399/functions/stat.html – gerardw 2013-10-11 12:04:00
這是一個錯誤的事情,因爲在AFTER返回的時間和之前'fstream'的open()得到實際上打開文件的文件可能已經不存在了(被系統中的另一個進程刪除)。 – PowerGamer 2015-01-05 12:11:55
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
編輯:我已收到通知,這並不一定表示文件不存在,因爲它可能會由於訪問權限或其他問題而被標記。
我知道我在回答這個問題時非常遲,但我想我會留下一條評論,無論如何,任何人瀏覽。您可以使用ifstream的失敗指示器來判斷文件是否存在。
ifstream myFile("filename.txt");
if(myFile.fail()){
//File does not exist code here
}
//otherwise, file exists
感謝您的「遲到」答案!我發佈它非常有用;) – ezdazuzena 2013-04-05 10:23:46
非常有用!非常感謝 – 2014-08-22 13:42:42
你的建議不是檢查「文件未找到」的方法。 'fail()'不表示「文件不存在」,它只是表示「有問題」。在你的特定例子中,它可以是「拒絕訪問」或「共享違規」等。 – PowerGamer 2015-01-05 12:18:16
一個簡單的方法從http://www.cplusplus.com/forum/general/1796/
ifstream ifile(filename);
if (ifile) {
// The file exists, and is open for input
}
功能std::fstream::good()
返回false
當文件不存在。這還不夠嗎?
std::fstream
繼承此功能從std::ios
。
它不是正流,而是流! – Phong 2010-10-15 05:30:42
請注意,這兩種方式檢查別的東西:該文件可能在那裏,但你可能沒有必要的權限... – rubenvb 2013-10-24 15:00:25
這不是一個本質上激烈的解決方案? – 2014-04-15 09:03:54