2011-11-09 83 views
11

我使用Windows API調用FindFirstFileFindNextFile來搜索與目錄中的某個通配符字符串匹配的文件。例如,我可能想要查找目錄中的所有XML文件,因此我使用「* .xml」模式進行搜索。是否有替代Windows FindFirstFile/FindNextFile API不搜索短文件名?

我遇到了問題,如果我在搜索3個字母的擴展名,並且文件的擴展名以3個字母的擴展名開頭,那麼即使擴展名包含例如,如果我的文件被命名爲somelongname.xmlaaaa,則將通過搜索「* .xml」獲取該文件。該文件的簡稱是somelo〜1.xml,它與我的通配符字符串相匹配。

我可以做我自己的通配符匹配來解決這個問題,但大概一個Windows API將能夠比我更有效地做到這一點,我的代碼會更簡單。據我所知,沒有辦法強制這些功能忽略短名稱。是否有任何API Windows公開此功能?

回答

3

不幸,JoeFish在他的回答中發現的文件證明有點誤導。即使您在FindExInfoBasic中傳遞,搜索仍將找到與短名稱匹配的文件。它不會在WIN32_FIND_DATA結構的cAlternateFileName成員中包含短文件名。

但是我發現有一個Windows函數PathMatchSpec將對提供的字符串進行相同的通配符匹配。所以,我能夠在我的搜索中添加第二步,驗證長名稱與模式匹配。它甚至可以在Windows XP中使用。

11

退房FindFirstFileEx - 它有一個fInfoLevelId參數,需要一個FINDEX_INFO_LEVELS枚舉:

typedef enum _FINDEX_INFO_LEVELS { 
    FindExInfoStandard, 
    FindExInfoBasic, 
    FindExInfoMaxInfoLevel 
} FINDEX_INFO_LEVELS; 

FindExInfoBasic

的FindFirstFileEx功能不查詢短文件名,提高了整體枚舉速度。數據以WIN32_FIND_DATA結構返回,並且cAlternateFileName成員始終爲NULL字符串。

但是:

的Windows Server 2008,Windows Vista中,在Windows Server 2003和Windows XP:不支持此值,直到在Windows Server 2008 R2和Windows 7

+0

有趣。我需要支持Windows XP,所以我可能不能依賴這個功能。不幸的是,在Windows 7中添加到此API中的事實可能表明,在此之前它不存在於任何其他API中。 –

+0

看起來就是這樣。對不起,你失敗了:)並感謝編輯,@ Rob – JoeFish

+0

原來這個文檔是非常誤導。即使您在FindExInfoBasic中傳遞,搜索仍將找到與短名稱匹配的文件。它不會在WIN32_FIND_DATA結構的cAlternateFileName成員中包含短文件名。 –