2011-04-28 89 views
1

有沒有人知道一個純粹的Win32解決方案,用於重命名文件並僅更改大小寫,而不涉及中間名重命名爲不同名稱或特殊權限(例如備份,還原) 。將Win32中的文件重命名爲只有大小寫不同的名稱

由於Win32子系統通常只將兩個文件名稱區分大小寫不同,所以我一直無法找到解決問題的辦法。

回答

5

我用MoveFile API編寫的測試程序似乎可行。 cmd.exe中的rename命令也是如此。你試過了什麼,你有什麼錯誤?

這是不相關的,但進一步的測試表明,以這種方式重命名長文件名可以工作,但會改變短文件名(例如在~1~2之間交替)。

+0

你試過什麼系統?我自己有'ERROR_ALREADY_EXISTS'。 – 0xC0000022L 2011-04-28 14:38:56

+0

Windows 7 x64。在FAT32和NTFS上都試過。 – Random832 2011-04-28 14:40:02

+0

我在Windows 5.x上,但我不認爲有根本的區別。此外,我幾乎可以肯定,我確實在Windows 7上有相同的錯誤(儘管我只使用NTFS)。現在懷疑一些過濾器驅動程序。將不得不進一步調查。不過,感謝獨立的結果。 – 0xC0000022L 2011-04-28 14:42:24

2

只需使用正常的MoveFile API。該調用可能只是變成ZwSetInformationFile(...,FileRenameInformation,...)FILE_RENAME_INFORMATION的文檔聲明您需要DELETE訪問權限,並且文件不能被鎖定等,但這些限制也可能適用於其他解決方案。

+0

謝謝。我意識到與本機API的關係。這確實是它在內部做的。但是,當我嘗試時,我一次又一次地得到了'ERROR_ALREADY_EXISTS'。必須是系統特定的或有FSFD過濾的東西。 – 0xC0000022L 2011-04-28 14:40:20

0

我不相信有一種方法可以公開兩個文件具有相同的名稱,這些文件僅在與Win32子系統拼寫方面有所不同。即使一些你如何創建這些文件,最可能的結果是隻有一個文件可以被訪問 - 打破了在Win32中保持原樣的目的。

如果你想進入Native層,你可以用NtCreateFile和InitializeObjectAttributes創建一個沒有OBJ_CASE_INSENSITIVE的文件,或者你可以用額外的空格填充結尾(如果你用額外的空格填充,文件將不可訪問從Win32 dos路徑)。請看這裏:http://www.osronline.com/ddkx/kmarch/k109_66uq.htm。我很確定你已經知道了,但是包括它在你不知道的時候。

+0

嗨,你誤解了這個問題。我不想*創建兩個文件,只能在大小寫不同的情況下共存。我想將一種形式的大寫改爲另一種,而不需要中間步驟。不過謝謝你的努力。 – 0xC0000022L 2011-04-29 17:04:44

0

只要您的文件沒有被其他程序立即需要,您可以使用我的解決方案。

當您重命名文件時,大寫並刪除最後一個字母。然後重新命名並返回該字母。

:)

+1

這不正是問題所要求避免的(「......不涉及中間重命名爲不同的名稱」) – Flexo 2011-09-02 21:01:34

相關問題