之前在寫C++時,因為某些關係只能使用C++內建的檔案操作類別fstream、ifstream或ofstream來完成
這時候如果要判斷檔案存不存在,並沒有像C#或Java中內建好可以使用的方法去調用
但是基本上在C++的檔案操作類別中沒有一個很明顯來判斷的方式,因此只能透過一些別的方式來判斷
或是引用別的檔案或函式庫
前言
之前在寫C++時,因為某些關係只能使用C++內建的檔案操作類別fstream、ifstream或ofstream來完成
這時候如果要判斷檔案存不存在,並沒有像C#或Java中內建好可以使用的方法去調用
但是基本上在C++的檔案操作類別中沒有一個很明顯來判斷的方式,因此只能透過一些別的方式來判斷
或是引用別的檔案或函式庫
那麼這篇很簡單的來介紹一下有些可以替代的方式來解決
方法
方法一:使用is_open()
使用 is_open() 來判斷建構時開檔或是用open()開檔時,檔案與串流有無關連到
string path;
cout << "Create File:";
cin >> path;
fstream fs(path.c_str(),ios::out);
//fs.open(path.c_str(),ios::out); 使用open開檔
if(fs.is_open()){
cout << "opened";
fs << "Hello";
}
else{
cout << "not exist";
}
fs.close();
本人只有C與D槽,打入X槽,會顯示不存在
輸入在D槽成功
不過由於這個方法並不是正解,所以檔案不存在被認為只是其中一種可能不法開啟檔案的原因(也有可能毀損
方法二:用good()方法判斷
如果檔案開啟順利,沒有任何問題或毀損也沒有讀檔完,會是goodbit狀態,這也是一個方法可以判斷
不過goodbit如果為false有三種可能
1.eofbit 讀到檔案結尾
2.failbit 可以讀取,但是有些內部的邏輯上錯誤,如今天我讀檔時,我預計讀到文字,他卻給我數字
3.badbit 檔案可能損毀導致無法讀取檔案中串流
if(fs.good()){
cout << "opened";
fs << "Hello";
}
方法三:判斷物件
直接判斷fstream的fs名稱物件,也是一種很快,也是最簡單的方式
if(fs){
cout << "opened";
fs << "Hello";
}
上述的檢查方式在fstream、ifstream與ofstream中皆可使用
方法四:使用stat()方法
stat()方法可以檢查檔案的屬性,而不需要做開檔的動作
先include系統檔案
#include <sys/stat.h>
判斷方法
struct stat buf;
if(stat(path.c_str(), &buf) != -1){
fstream fs(path.c_str(),ios::out);
cout << "opened";
fs << "Hello";
fs.close();
}
else{
cout << "not exist";
}
使用Boost
除了上述的方式,也可以建議使用看看Boost library中的方法
boost::filesystem::path myfile("test.txt");
if( !boost::filesystem::exists(myfile) ){
// what do you want to do if the file doesn't exist
}
else{
}
結論
除了方法一與二外,其他是比較可信的判斷,這篇文章也是一個紀錄與整理,如果遇到類似問題的人可以直接參考
參考資料
c++ reference : How to find out if a file exists
ifstream: how to tell if specified file doesn't exist
How to check if a file exists and is readable in C++?
hecking if a file exists in Open C and C++
C++ ifstream failbit and badbit
文章中的敘述如有觀念不正確錯誤的部分,歡迎告知指正 謝謝 =)
另外要轉載請附上出處 感謝