C# 重命名同名目录不同大小写

C# 重命名同名目录不同大小写,c#,.net,vb.net,rename,C#,.net,Vb.net,Rename,我试图将c#中的一个目录重命名为相同的名称,但大小写不同 例如: f:\test到f:\test 我尝试过以下代码: var directory = new DirectoryInfo("f:\\test"); directory.MoveTo("f:\\TEST"); 我得到一个IOException-源路径和目标路径必须不同。我还尝试了Directory.Move(),得到了相同的结果 这是怎么做到的?我是否必须创建一个单独的临时目录,将包含的文件从原始目录移动到临时目录,然后删除原始目录

我试图将c#中的一个目录重命名为相同的名称,但大小写不同

例如: f:\test到f:\test

我尝试过以下代码:

var directory = new DirectoryInfo("f:\\test");
directory.MoveTo("f:\\TEST");
我得到一个IOException-源路径和目标路径必须不同。我还尝试了Directory.Move(),得到了相同的结果


这是怎么做到的?我是否必须创建一个单独的临时目录,将包含的文件从原始目录移动到临时目录,然后删除原始目录,并重命名临时目录?

在这种情况下,答案是肯定的-文件系统本身并不认为这两个目录不同,因此您需要删除并添加为新名称(或者按照您的建议移动/删除/移动)

为什么不重命名目录
temp
,然后再次重命名为
TEST

好吧,您不需要创建单独的目录并移动所有内容。只需将文件夹重命名为其他名称,然后重新命名为您想要的名称:

var dir = new DirectoryInfo(@"F:\test");
dir.MoveTo(@"F:\test2");
dir.MoveTo(@"F:\TEST");

即使.NET方法
DirectoryInfo.MoveTo
在名称相同时引发异常,您也可以这样调用Windows API函数来设置目录名称的大小写:

bool success = MoveFile(dirInfo.FullName, dirInfo.FullName);
使用此外部声明:

[DllImport("kernel32", SetLastError = true)]
private static extern bool MoveFile(string lpExistingFileName, string lpNewFileName);
如果名称只是大小写不同,它对我来说很好。当名称已经完全符合指定时,我没有尝试过这样调用它

这样做的好处是,目录永远不会以其原始名称消失


虽然它只在Windows上工作,但它也有缺点。

谢谢,这比我描述的方式更有意义。实际上,
MoveFileEx
甚至不需要那个标志来做这件事;你甚至可以使用
MoveFile
,它工作得很好。是BCL阻止了重命名,而不是Win32。文件系统本身就是这样做的它周围的e Windows API包装器引入了不区分大小写的特性。这非常有效,但它只影响实际的文件/目录,而不影响根目录(如果移动文件,则影响文件所在的目录)。因此,如果您需要整个路径符合所需名称,则需要在所有目录之间循环,从路径到根目录,并检查/将每个目录移动到具有所需大写字母的新名称。