1. 程式人生 > >windows核心判斷檔案是否存在的方法

windows核心判斷檔案是否存在的方法

不論在應用層還是在核心層我們經常要判定一個檔案是否存在, 在產品開發過程中我看到了該問題的多種實現方法, 這裡拿出來和大家分享!

方法一:GetFileAttributes
在Google的Chrome程式碼中看到的實現方法,利用GetFileAttributes介面的返回值,如果介面返回
INVALID_FILE_ATTRIBUTES則說明檔案不存在,反之,則存在!該方法簡單好使!

方法二:FindFirstFile
通過查詢目錄項的方法應該說是最容易想到的一種方法,可是該方法比較繁瑣,並且底層檔案系統
實現的效率較低(實際專案中測試過);

方法三:CreateFile
通過CreateFile介面的返回值以及GetLastError介面來判定檔案是否存在,該方法應該說是原始的、


萬能法(在核心中也可以用這種方法來判定檔案是否存在);


以上這三種方法一看就知道方法一是最簡單、最好用的方法,並且其效率也較高,這是因為GetFileAttributes內部走的是FAST IO介面 - IRP_MJ_NETWORK_QUERY_OPEN,這一個介面 完成了開啟檔案和查詢檔案這兩個操作,所以它的效率較高。而FindFirstFile介面走的是 IRP_MJ_CREATE和IRP_MJ_DIRECTORY_CONTROL兩個介面,先開啟目錄物件,然後再查詢目錄項, 當遇到目錄項很多時這個介面的效率也會一落千丈,所以我很少使用它;而最後一個 介面CreateFile是最通用的一個介面,它在應用層和核心層都適用,並且在核心層我們無法直接使用 FAST IO介面IRP_MJ_NETWORK_QUERY_OPEN,所以好用的也就是它了,不過在應用層我們通過 GetLastError來獲取錯誤碼的,而在核心層直接讀狀態嗎即可。

xicao54007回覆Coding狂人:fopen是clib對CreateFile的C語言封裝了 2010-08-25 08:52 回覆 Coding狂人 Coding狂人我了個去 這是什麼效率啊FILE *fp;fp=fopen("FilePath","r");if(fopen==NULL){ MessageBox(NULL,"檔案不存在","提示",MB_OK);} 2010-08-24 17:23 回覆 匿名網友 匿名網友CreateFile方法不好!