VC 判斷檔案或資料夾是否存在

2021-09-16 18:05:35 字數 3522 閱讀 1343

在windows應用專案中,幾乎總會需要用到一些檔案系統相關的函式,如:判斷檔案是否存在,判斷資料夾是否為空,刪除資料夾及其所有子項,計算資料夾的大小,等等。不知為何,windows並未提供直接的api來完成這些操作,於是,**江湖上開始創立起各種流派,一片刀光劍影。。。

大道流:getfileattributes

大道至簡,大道就在你眼前!對於一般的應用來說,getfileattributes可以說是判斷檔案或資料夾是否存在最好的api。因為它功能明確,使用簡單,支援xp系統,更重要的是它可以直接區別檔案和資料夾。當我們要寫乙個判斷檔案或資料夾是否存在的函式時,它應該是首選,不然我就要問你一句:參天大道(咦,好像有**不對=.=)你不走,你si bu si sa?**如下:

// 判斷檔案是否存在

bool isfileexist(const cstring& csfile)

// 判斷資料夾是否存在

bool isdirexist(const cstring & csdir)

// 判斷檔案或資料夾是否存在

bool ispathexist(const cstring & cspath)

// 變變變變變種(聽說會更快一點),見備註1

bool ispathexist(const cstring & cspath)

;return 0 != getfileattribute***(cspath, getfileexinfostandard, &attrs);

}殘暴流:createfile

這世界從來不乏狠人,程式設計師界也是如此。功能強大的apicreatefile由於存在open_existing配置,使得它可以用來判斷檔案或資料夾的存在於否。但是它洋洋灑灑幾千字的說明文件和數十條的外部鏈結,無不在明確地向程式設計師宣告:我有很多坑,你敢來踩嗎?這句宣言會嚇退無數人,除了狠人。這些狠人會把諸多的說明文字和外部鏈結通通屠滅,最終抽取出一條規則之鏈-檔案判斷,然後用在專案中。但是如果有一點不小心,這條規則之鏈就會斷裂,bug大魔王就會降臨!所以,這個流派的**,無論是對專案還是對自己,都堪稱殘暴!所以,下面這個函式的正確性我不予負責(我甚至敢拿我的機械鍵盤起誓,它一定是不正確的)!!!**如下:

// 判斷檔案或資料夾是否存在

bool ispathexist(const cstring & cspath)

if (invalid_handle_value != hfile)

return true;

}古典流:_access

有人喜新,自然就有人戀舊。一些具有古典情懷的程式設計師,堅持要在windows api的地盤上為c庫函式謀得一方淨土。於是在一堆駝峰變數和函式名當中,那個整齊低調的_access在靜默中捍衛著自己的尊嚴。沒什麼好說的,致敬,上**:

// 判斷檔案或資料夾是否存在

bool ispathexist(const cstring & cspath)

嬌弱流:findfirstfile

菜鳥剛邁出家門闖蕩江湖時,總是天真的,稚嫩的,他們創立的教派也是嬌弱的。findfirstfile以find和first暗合了菜鳥的探索之心和初涉之意,從而贏得了他們的青睞。但在實際應用中,它卻被bug大魔王輕易地打敗:它的引數不能由\結尾,它不能正確地判斷根目錄,**複雜。**如下:

// 判斷檔案是否存在

bool isfileexist(const cstring & csfile)

;handle hfind = findfirstfile(csfile, &fd);

if (invalid_handle_value == hfind)

findclose(hfind);

hfind = invalid_handle_value;

return 0 == (file_attribute_directory & fd.dwfileattributes);

}// 判斷資料夾是否存在

bool isdirexist(const cstring & csdir)

;handle hfind = findfirstfile(csfind, &fd);

if (invalid_handle_value == hfind)

findclose(hfind);

hfind = invalid_handle_value;

return 0 != (file_attribute_directory & fd.dwfileattributes);

}// 判斷檔案或資料夾是否存在

bool ispathexist(const cstring & cspath)

豪放流:pathfileexists

人生苦短,莫使金樽空對月,莫要悶頭寫**。對這個流派的**來說,事情做到就好,有一點***無所謂,有那時間還不如尋歡作樂呢!所以他們選擇了pathfileexists。這個由權威機構封裝的api確實給人以安全感,但令人不爽的是,它需要我們額外依賴shlwapi.dll。就為了乙個api,值得嗎?有的人在沉思,但有的人早已給出了答案。**如下:

// 判斷檔案或資料夾是否存在

bool ispathexist(const cstring & cspath)

作死流:deletefile/removedirectory

程式設計師圈子也是乙個完整的生物圈,生物多樣性也是很***的。所以有乙個流派我們萬萬不能忽視,那是是:作死流!作死流的**,生存的意義就在於求死,順便給其他人帶來一些意外,說不定還促成了某些蝴蝶效應呢!在windows平台上,他們就成功地用既定事實告訴你檔案或資料夾到底是否存在。**如下:

// 判斷檔案是否存在

bool isfileexist(const cstring & csfile)

return error_access_denied == getlasterror();

}// 判斷資料夾是否存在

bool isdirexist(const cstring & csdir)

return error_access_denied == getlasterror() || error_dir_not_empty == getlasterror();

}// 判斷檔案或資料夾是否存在

bool ispathexist(const cstring & cspath)

總結上述流派,各有優劣。列表如下:

流派    支援xp    可以分辨檔案和資料夾    有額外依賴項    **難易度    已知判斷出錯的情況(不代表其他情況就一定正確)

大道流    是    是        易    網路共享(應指定網路共享的子資料夾)

殘暴流    是            難    根目錄如「c:\」,但「c:/」這樣是可以的- -!

古典流    是            易    暫無

嬌弱流    是    是        難    暫無

豪放流    是        shlwapi.dll    易    unc路徑指定的資料夾(檔案可以)

作死流    是    是        中    我沒敢試●-●

然而我並不相信這幾個流派就是此方江湖的全部。我相信在某些不盡人知的地方,一定存在著一些隱藏宗派,古老世家,可以分分鐘殺這些流派。還請知情人告我!

c 判斷檔案或資料夾是否存在

判斷檔案是否存在 bool isfileexist const cstring csfile 判斷資料夾是否存在 bool isdirexist const cstring csdir 判斷檔案或資料夾是否存在 bool ispathexist const cstring cspath 變變變變變種...

shell 判斷資料夾或檔案是否存在

資料夾不存在則建立 1 2 3 4 5 if d data then mkdir data else echo 資料夾已經存在 fi 檔案存在則刪除 1 2 3 4 5 if f data filename then echo 檔案不存在 else rm rf data filename fi 判斷...

shell 判斷資料夾或檔案是否存在

資料夾不存在則建立 if d data then mkdir data else echo 資料夾已經存在 fi 檔案存在則刪除 if f data filename then echo 檔案不存在 else rm rf data filename fi 判斷資料夾是否存在 if d data th...