在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...