最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c++判斷文件是否存在的方法匯總

 更新時間:2023年08月01日 09:46:15   作者:guotianqing  
這篇文章主要介紹了c++判斷文件是否存在的方法匯總,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

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ā)生錯誤的時候會拋出異常,但是在大部分情況下這些異常是可以忽略的,例如,在檢查文件是否存在的時候,發(fā)生錯誤可以等同于文件不存在。

雖然boost.filesystem也提供了重載函數(shù),通過輸出參數(shù)返回錯誤來代替異常,但是在每個調(diào)用點都得定義一個輸出參數(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。當path指向一個“常規(guī)文件”的時候,認為該文件存在;否則其它任何情況都認為文件不存在。

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

事實上,用boost::filesystem::status獲取時,會返回symlink_file,boost.filesystem將它們視為符號鏈接文件。

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

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

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ā)生錯誤,則認為文件不存在。

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

c++判斷文件是否存在+獲取文件大小

判斷文件是存在

GetFileAttributes( m_Output) == -1 //判斷文件是否存在若不存在返回-1
返回字段返回值屬性類型
FILE_ATTRIBUTE_READONLY1只讀
FILE_ATTRIBUTE_HIDDEN2隱藏
FILE_ATTRIBUTE_SYSTEM4系統(tǒng)
FILE_ATTRIBUTE_DIRECTORY16目錄
FILE_ATTRIBUTE_ARCHIVE32存檔
FILE_ATTRIBUTE_DEVICE64保留
FILE_ATTRIBUTE_NORMAL128正常
FILE_ATTRIBUTE_TEMPORARY256臨時
FILE_ATTRIBUTE_SPARSE_FILE512稀疏文件
FILE_ATTRIBUTE_REPARSE_POINT1024超鏈接或快捷方式
FILE_ATTRIBUTE_COMPRESSED2048壓縮
FILE_ATTRIBUTE_OFFLINE4096脫機
FILE_ATTRIBUTE_NOT_CONTENT_INDEXED8192索引
FILE_ATTRIBUTE_ENCRYPTED16384加密
FILE_ATTRIBUTE_VIRTUAL65536虛擬

橙色標記的屬性為 Windows 系統(tǒng)中文件的公有屬性,其中 “ 只讀 ” 、 “ 隱藏 ” 、 “ 系統(tǒng) ” 、 “ 存檔 ” 為文件的四種基本屬性。 

compressed , content_indexed , encrypted 只存在于 NTFS 分區(qū)中。

文件去掉全部屬性后(四種基本屬性),將自動標記為 normal 。同時具有 system 和 hidden 屬性的文件會在系統(tǒng)中徹底隱形,這也是病毒常用的伎倆。

commpressed 和 encrypted 不能共存。默認情況下文件有 content_indexed 屬性。

獲取文件大小

ULONGLONG size;
CFileStatus fileStatus;
//文件絕對路徑
if (CFile::GetStatus(m_Output, fileStatus))
size = fileStatus.m_size;

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • C語言實現(xiàn)簡單的定時器

    C語言實現(xiàn)簡單的定時器

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)簡單的定時器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • C++實現(xiàn)自頂向下的歸并排序算法

    C++實現(xiàn)自頂向下的歸并排序算法

    這篇文章主要介紹了C++實現(xiàn)自頂向下的歸并排序算法,結(jié)合實例詳細分析了自頂向下的歸并排序算法的原理與具體實現(xiàn)步驟,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-12-12
  • C++之Qt5雙緩沖機制案例教程

    C++之Qt5雙緩沖機制案例教程

    這篇文章主要介紹了C++之Qt5雙緩沖機制案例教程,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • Visual Studio新建類從默認internal改為public

    Visual Studio新建類從默認internal改為public

    本文將介紹如何將Visual Studio中的internal修飾符更改為public,以實現(xiàn)更廣泛的訪問和重用,需要的朋友們下面隨著小編來一起學習學習吧
    2023-09-09
  • C++ cin.getline及getline()用法詳解

    C++ cin.getline及getline()用法詳解

    這篇文章主要介紹了C++ cin.getline用法及C++ getline()的兩種用法,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • C語言中聯(lián)合體與共用體和枚舉使用語法示例

    C語言中聯(lián)合體與共用體和枚舉使用語法示例

    這篇文章主要介紹了C語言中聯(lián)合體與共用體和枚舉使用語法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2022-12-12
  • C++?Cartographer的入口node main詳細講解

    C++?Cartographer的入口node main詳細講解

    這篇文章主要介紹了C++Node類Cartographer的入口node main,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2023-03-03
  • 用C語言程序判斷大小端模式

    用C語言程序判斷大小端模式

    本文介紹了用C語言程序判斷大小端的方法,與大家分享一下。
    2013-04-04
  • Linux下C語言的fork()子進程函數(shù)用法及相關問題解析

    Linux下C語言的fork()子進程函數(shù)用法及相關問題解析

    fork()函數(shù)在Linux下可以用于產(chǎn)生一個子進程,這里我們挑選了兩個fork相關的面試題,來看一下Linux下C語言的fork()子進程函數(shù)用法及相關問題解析
    2016-06-06
  • 關于C語言中弱符號與弱引用的實際應用問題

    關于C語言中弱符號與弱引用的實際應用問題

    在編碼過程中,我們經(jīng)常遇到符號重定義的錯誤問題,本文通過實例代碼展示給大家介紹了C語言弱符號與弱引用的實際應用問題,一起看看吧
    2021-09-09

最新評論

仪陇县| 邻水| 都安| 海盐县| 永丰县| 仙居县| 青浦区| 满洲里市| 泗阳县| 朝阳市| 桂林市| 荔波县| 积石山| 西贡区| 乌苏市| 邻水| 铜陵市| 华池县| 宜州市| 友谊县| 道孚县| 砀山县| 荥经县| 法库县| 无极县| 富民县| 海城市| 宜章县| 托克逊县| 泗洪县| 民乐县| 新丰县| 天峻县| 石门县| 民丰县| 南丰县| 镇坪县| 桐柏县| 绵阳市| 施秉县| 西乡县|