【问题标题】:File or Folder rename to lower case In C# using DirectoryInfo/FileInfo.MoveTo()在 C# 中使用 DirectoryInfo/FileInfo.MoveTo() 将文件或文件夹重命名为小写
【发布时间】:2011-11-16 13:52:21
【问题描述】:

我有一个程序可以将文件或文件夹重命名为小写名称。我写了这段代码:

    private void Replace(string FolderLocation, string lastText, string NewText)
    {
        if (lastText == "")
        {
            lastText = " ";
        }
        if (NewText == "")
        {
            NewText = " ";
        }

        DirectoryInfo i = new DirectoryInfo(FolderLocation);
        string NewName = "";
        if (checkBox2.Checked)
        {
            if (i.Parent.FullName[i.Parent.FullName.Length - 1].ToString() != "\\") //For parents like E:/
            {
                NewName = i.Parent.FullName + "\\" + i.Name.Replace(lastText, NewText);
            }
            else
            {
                NewName = i.Parent.FullName + i.Name.Replace(lastText, NewText);
            }

                NewName = NewName.ToLower();


            if (NewName != i.FullName)
            {
                 i.MoveTo(NewName);
            }
            foreach (DirectoryInfo sd in i.GetDirectories())
            {
                Replace(sd.FullName, lastText, NewText);
            }
        }
        if (checkBox1.Checked)
        {
            foreach (FileInfo fi in i.GetFiles())
            {
                NewName = fi.Directory + "\\" + fi.Name.Replace(lastText, NewText);

                    NewName = NewName.ToLower();

                if (NewName != fi.FullName)
                {
                    fi.MoveTo(NewName);
                }
            }
        }
    }

但我得到以下异常:

“源路径和目标路径必须不同。”

我该如何解决这个问题?

【问题讨论】:

  • Windows 不区分大小写,就文件名而言。
  • 好的。但是它如何显示文件名?
  • 它使用保存的内容。但是在比较文件名时 - "FILENAME" == "filename" == "FileName",就它而言。
  • 我认为 Windows 操作系统不允许在同一文件夹中包含给定文件,例如“test.txt”和“Test.txt”。这就是为什么你的例外。 MoveTo 将文件复制到新位置并删除旧位置。改用 FileSystem.Rename (msdn.microsoft.com/en-gb/library/…)
  • @PilgerstorferFranz 虽然在标准情况下你是对的 Windows/NTFS 实际上可以配置为允许这样做。

标签: c# .net file-rename fileinfo directoryinfo


【解决方案1】:

由于 Windows 不区分大小写,就文件名而言,您需要将文件重命名为临时名称,然后用小写字符重新命名。

【讨论】:

  • 现在我收到“拒绝访问”的错误信息。但我以管理员身份运行它。发生了什么??
  • @ahmadalishafiee - “访问被拒绝”总是意味着缺乏权限。确保路径允许执行应用程序的用户(可能是您的用户)。
  • 这意味着无法访问程序的文件/文件夹。但我想发布我的程序。如何解决此错误?
  • 很可能该目录正在使用中。这可以是一个简单的 Windows Explorer 实例。使用 DirectoryInfo 的目录操作对此非常明智。
【解决方案2】:

虽然 Windows 文件系统存储名称区分大小写,但它们在名称比较时不区分大小写,因此您的重命名操作将不起作用...

如果您确实需要/想要这样做,您需要先将文件/目录临时重命名为不同且独特的名称,然后将其“重新”重命名为您想要的“小写名称”。

参考见http://msdn.microsoft.com/en-us/library/ee681827%28v=vs.85%29.aspxhttp://support.microsoft.com/kb/100108/en-us

如果您需要 NTFS 区分大小写,您可以将 HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\kernel\ 下的 dword ObCaseInsensitive 设置为 0(不推荐!)。

如果您正在处理 NFS,请查看 http://technet.microsoft.com/en-us/library/cc783185%28WS.10%29.aspx

【讨论】:

    【解决方案3】:

    这行得通:

    File.Move(destinationFilePath, destinationFilePath);
    

    【讨论】:

      【解决方案4】:

      不幸的是,这是一个 Windows 问题,因为 Oded 在 cmets 中提到它不区分大小写。您需要做的是两次重命名文件夹。通过将文件夹移动到一个新的临时名称,然后返回到原始名称的小写。

      【讨论】:

      • 这不是 Windows 问题,这是 .Net 问题。 Win32 的 MoveFileEx 支持仅大小写重命名; .Net 搞错了。
      猜你喜欢
      • 2019-04-10
      • 2011-04-18
      • 2017-12-12
      • 2017-10-11
      • 2011-02-08
      • 2010-09-14
      • 1970-01-01
      • 2012-09-03
      • 2011-11-26
      相关资源
      最近更新 更多