使用DirectoryInfo/FileInfo.MoveTo()在C#中将文件或文件夹重命名为小写

3
我有一个将文件或文件夹重命名为小写名称的程序。我已经编写了这段代码:

    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);
                }
            }
        }
    }

但我遇到了以下异常:

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

我该如何解决这个问题?


3
就文件名而言,Windows是不区分大小写的。 - Oded
好的,但它如何显示文件名? - ahmadali shafiee
它使用已保存的内容。但是在比较文件名时,“FILENAME” ==“filename” ==“FileName”,就其而言。 - Oded
我认为Windows操作系统不允许在同一文件夹中存在相同名称但大小写不同的文件,例如“test.txt”和“Test.txt”。这就是为什么你会遇到异常的原因。MoveTo方法将文件复制到新位置并删除旧文件。请尝试使用FileSystem.Rename方法代替(http://msdn.microsoft.com/en-gb/library/microsoft.visualbasic.filesystem.rename.aspx)。 - Pilgerstorfer Franz
@PilgerstorferFranz 虽然在标准情况下你是正确的,但 Windows/NTFS 实际上可以配置允许这样做。 - Yahia
4个回答

6

由于Windows对文件名不区分大小写,因此您需要将文件重命名为临时名称,然后再重新命名为小写字符。


现在我得到了“访问被拒绝”的异常,但我以管理员身份运行它。发生了什么? - ahmadali shafiee
@ahmadalishafiee - “访问被拒绝”通常意味着缺少权限。请确保路径对执行应用程序的用户(可能是您自己)有许可权限。 - Oded
这意味着程序无法访问文件/文件夹。但我想发布我的程序。我该如何解决这个错误? - ahmadali shafiee
1
很可能目录正在使用中。这可能是一个简单的Windows资源管理器实例。使用DirectoryInfo进行目录操作时非常敏感。 - sɐunıɔןɐqɐp

2
尽管Windows文件系统区分大小写,但在名称比较时它们是不区分大小写的,因此您的重命名操作将无法正常工作...如果您确实需要/想要这样做,您需要先将文件/目录暂时重命名为不同且唯一的名称,然后再将其“恢复”为您想要的“小写名称”。有关参考,请参见http://msdn.microsoft.com/en-us/library/ee681827%28v=vs.85%29.aspxhttp://support.microsoft.com/kb/100108/en-us。如果您需要NTFS区分大小写,可以将dword ObCaseInsensitive设置为0(不推荐!)在HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\kernel\下。
如果您正在处理NFS,则请参见http://technet.microsoft.com/en-us/library/cc783185%28WS.10%29.aspx

1
这个可以工作:

File.Move(destinationFilePath, destinationFilePath);

0

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


3
这不是Windows的问题,而是一个.Net的问题。Win32的MoveFileEx支持仅大小写更改的重命名,但.Net在这方面出现了错误。 - antiduh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接