[C++] 如何確認開檔讀檔時,檔案是否存在(file exist) -五種不同方式

之前在寫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槽,會顯示不存在

disk

not exist

輸入在D槽成功

open

file

不過由於這個方法並不是正解,所以檔案不存在被認為只是其中一種可能不法開啟檔案的原因(也有可能毀損

 

方法二:用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

 


 

文章中的敘述如有觀念不正確錯誤的部分,歡迎告知指正 謝謝 =)

另外要轉載請附上出處 感謝