2013-05-15 55 views
2

由於我使用宏似乎工作,如果給定的路徑大小寫不等於驅動器上的本地路徑,我首先需要驗證路徑是否存在或不存在。不幸的是(在我的情況下)Directory.Exists()不區分大小寫。FindFirstFileEx不操作區分大小寫

所以我試着FindFirstFileExdwAdditionalAttributes設置爲1其中代表FIND_FIRST_EX_CASE_SENSITIVE。但它似乎不適合我。我的本地路徑是C:\Dir1\Dir2\Dir3。我比較的路徑是C:\dir1\Dir2\Dir3。不幸的是,我總是得到Dir3。如果案件不匹配,我會期待一個空的結果。

我的錯是什麼?

string dir = @"C:\Dir1\Dir2\Dir3" + '\0'; 
int FIND_FIRST_EX_CASE_SENSITIVE = 1; 
WIN32_FIND_DATA fi; 

IntPtr h = FindFirstFileEx(dir, 
          FINDEX_INFO_LEVELS.FindExInfoStandard, 
          out fi, 
          FINDEX_SEARCH_OPS.FindExSearchNameMatch, 
          IntPtr.Zero, 
          FIND_FIRST_EX_CASE_SENSITIVE); 
+3

您實際路徑是一樣的,你要作爲參數傳遞的路徑。這是否是一個錯字? – ken2k

+1

對我來說,似乎應該以另一種方式解決原始問題,而不是在不區分大小寫的環境中依賴文件系統對象的大小寫。什麼不適用於這個宏? –

+0

@ ken2k謝謝,我的錯。 @ 0xA3宏將停止擴展文件夾瀏覽器對話框中的文件夾,直至遇到不匹配的情況。我無法改變宏觀本身。 – theknut

回答

4

此功能依賴於註冊表項HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\kernel\obcaseinsensitive設定的值設置爲0,這不是默認值。

換句話說,它取決於底層文件系統設置,而不是API本身。

更多的細節在這裏:http://www.siao2.com/2010/12/08/10101148.aspx

2

默認情況下,在Windows文件搜索始終不區分大小寫,無論使用的FIND_FIRST_EX_CASE_SENSITIVE的。

要改變這一點,你必須改變註冊表中的值(據我所知)。

在這裏看到了血淋淋的細節:

http://www.nicklowe.org/2012/02/understanding-case-sensitivity-in-windows-obcaseinsensitive-file_case_sensitive_search/

在你的情況,我希望

HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Kernel, REG DWORD obcaseinsensitive設置爲1

+0

如果我將它設置爲0.是否需要重新啓動?因爲FindFirstFileEx仍然發現了一些... – theknut

+0

@theknut是的,你必須重新啓動。它只在啓動時讀取。 –

+0

哦,我的天啊...有沒有其他方法可以驗證區分大小寫?我可以重啓系統,因爲其他人也會使用它。 – theknut