【问题标题】:Renaming Directory with same name different case重命名同名目录不同大小写
【发布时间】:2010-12-10 00:07:33
【问题描述】:

我正在尝试将 c# 中的目录重命名为相同的名称,但大小写不同。

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

我试过这段代码:

var directory = new DirectoryInfo("f:\\test");
directory.MoveTo("f:\\TEST");

我得到一个 IOException - 源路径和目标路径必须不同。我也尝试过 Directory.Move() 得到相同的结果。

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

【问题讨论】:

    标签: c# .net vb.net rename


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,这比我描述的方式更有意义。
    • 实际上,MoveFileEx 甚至不需要那个标志来做它;你甚至可以使用MoveFile,它工作正常。阻止重命名的是 BCL,而不是 Win32。
    【解决方案2】:

    即使.NET方法DirectoryInfo.MoveTo在名称相同的情况下抛出异常,你也可以像这样调用Windows APIMoveFile函数来设置目录名的大小写:

    bool success = MoveFile(dirInfo.FullName, dirInfo.FullName);
    

    有了这个外部声明:

    [DllImport("kernel32", SetLastError = true)]
    private static extern bool MoveFile(string lpExistingFileName, string lpNewFileName);
    

    当名称不同时,它对我来说很好用。当名称已经完全符合指定时,我还没有尝试过这样称呼它。

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

    它的缺点是它只能在 Windows 上运行。

    【讨论】:

    • 这很好用,但它只影响实际的文件/目录,而不影响根目录(或文件所在的目录,如果移动文件)。因此,如果您需要整个路径符合所需的名称,则需要遍历从路径到根目录的所有目录,并检查/将每个目录移动到具有所需大小写的新名称。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 文件系统本身。围绕它的 Windows API 包装器引入了不区分大小写的功能。
      猜你喜欢
      • 1970-01-01
      • 2013-10-14
      • 2012-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-29
      • 2016-08-16
      相关资源
      最近更新 更多