2011-04-28 90 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

相关问题