c++判斷文件是否存在

轉(zhuǎn)載https://blog.csdn.net/guotianqing/article/details/100766120
c++ 判斷文件是否存在的幾種方法
一般而言,下述方法都可以檢查文件是否存在:

使用ifstream打開文件流串纺,成功則存在,失敗則不存在
以fopen讀方式打開文件搓萧,成功則存在缤弦,否則不存在
使用access函數(shù)獲取文件狀態(tài),成功則存在压彭,否則不存在
使用stat函數(shù)獲取文件狀態(tài)闻妓,成功則存在菌羽,否則不存在

代碼如下:

#include <sys/stat.h>
#include <unistd.h>
#include <string>
#include <fstream>

inline bool exists_test0 (const std::string& name) {
    ifstream f(name.c_str());
    return f.good();
}

inline bool exists_test1 (const std::string& name) {
    if (FILE *file = fopen(name.c_str(), "r")) {
        fclose(file);
        return true;
    } else {
        return false;
    }   
}

inline bool exists_test2 (const std::string& name) {
    return ( access( name.c_str(), F_OK ) != -1 );
}

inline bool exists_test3 (const std::string& name) {
  struct stat buffer;   
  return (stat (name.c_str(), &buffer) == 0); 
}

參考資料中有性能測試對比,結(jié)果表明由缆,使用 stat() 函數(shù)的方式性能最好注祖。

# Results for total time to run the 100,000 calls averaged over 5 runs,

Method exists_test0 (ifstream): **0.485s**
Method exists_test1 (FILE fopen): **0.302s**
Method exists_test2 (posix access()): **0.202s**
Method exists_test3 (posix stat()): **0.134s**

boost庫

boost.filesystem在發(fā)生錯誤的時(shí)候會拋出異常,但是在大部分情況下這些異常是可以忽略的均唉,例如是晨,在檢查文件是否存在的時(shí)候,發(fā)生錯誤可以等同于文件不存在舔箭。

雖然boost.filesystem也提供了重載函數(shù)罩缴,通過輸出參數(shù)返回錯誤來代替異常蚊逢,但是在每個(gè)調(diào)用點(diǎn)都得定義一個(gè)輸出參數(shù),稍顯麻煩箫章。

所以烙荷,為了簡化客戶代碼,我們實(shí)現(xiàn)了一些包裝函數(shù)檬寂,如下所示:

bool IsFileExistent(const boost::filesystem::path& path) {
    boost::system:error_code error;
    return boost::filesystem::is_regular_file(path, error);
}

上面的函數(shù)用來檢查文件是否存在终抽,使用了boost::filesystem::is_regular_file。當(dāng)path指向一個(gè)“常規(guī)文件”的時(shí)候桶至,認(rèn)為該文件存在昼伴;否則其它任何情況都認(rèn)為文件不存在。

對于只有常規(guī)文件的情況镣屹,該函數(shù)沒有問題圃郊。但是,如果還存在其他文件時(shí)女蜈,如符號鏈接文件時(shí)描沟,則返回文件不存在。

事實(shí)上鞭光,用boost::filesystem::status獲取時(shí),會返回symlink_file泞遗,boost.filesystem將它們視為符號鏈接文件惰许。

不論是常規(guī)文件還是符號鏈接文件,呈現(xiàn)給用戶的都是能夠正常使用的文件史辙。

所以汹买,不能單純地用boost::filesystem::is_regular_file來檢查文件是否存在了,下面是包裝函數(shù)的改進(jìn)版本:

bool IsFileExistent(const boost::filesystem::path& path) {

    boost::system:error_code error;
    auto file_status = boost::filesystem::status(path, error);
    if (error) {
        return false;
    }

    if (! boost::filesystem::exists(file_status)) {
        return false;
    }

    if (boost::filesystem::is_directory(file_status)) {
        return false;
    }

    return true;
}

首先聊倔,通過boost::filesystem::status獲取文件的信息晦毙,如果發(fā)生錯誤,則認(rèn)為文件不存在耙蔑。

然后见妒,使用boost::filesystem::exists判斷文件是否存在,該函數(shù)不區(qū)分文件夾和文件甸陌,所以最后還要使用boost::filesystem::is_directory判斷一下是否文件夾须揣,只要不是文件夾,都認(rèn)為文件是存在的钱豁。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末耻卡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子牲尺,更是在濱河造成了極大的恐慌卵酪,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異溃卡,居然都是意外死亡溢豆,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進(jìn)店門塑煎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沫换,“玉大人,你說我怎么就攤上這事最铁⊙渡停” “怎么了?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵冷尉,是天一觀的道長漱挎。 經(jīng)常有香客問我,道長雀哨,這世上最難降的妖魔是什么磕谅? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮雾棺,結(jié)果婚禮上膊夹,老公的妹妹穿的比我還像新娘。我一直安慰自己捌浩,他們只是感情好放刨,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著尸饺,像睡著了一般进统。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上浪听,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天螟碎,我揣著相機(jī)與錄音,去河邊找鬼迹栓。 笑死掉分,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的克伊。 我是一名探鬼主播叉抡,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼答毫!你這毒婦竟也來了褥民?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤洗搂,失蹤者是張志新(化名)和其女友劉穎消返,沒想到半個(gè)月后载弄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡撵颊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年宇攻,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片倡勇。...
    茶點(diǎn)故事閱讀 38,747評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡逞刷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出妻熊,到底是詐尸還是另有隱情夸浅,我是刑警寧澤,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布扔役,位于F島的核電站帆喇,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏亿胸。R本人自食惡果不足惜坯钦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望侈玄。 院中可真熱鬧婉刀,春花似錦、人聲如沸序仙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽诱桂。三九已至,卻和暖如春呈昔,著一層夾襖步出監(jiān)牢的瞬間挥等,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工堤尾, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留肝劲,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓郭宝,卻偏偏與公主長得像辞槐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子粘室,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評論 2 350