DirectoryInfo.MoveTo - "源和目标路径必须具有相同的根。移动不会跨卷运行。"

时间:2014-10-24 23:16:03

标签: c# directoryinfo

我试图弄清楚这里发生了什么。我有一个例程,查看目录中的所有目录,并从目录名的第一部分删除任何非数字值。出于某种原因,当它去做MoveTo我得到"源和目标路径必须具有相同的根。移动不会跨卷运行。"但我只提供新名称作为参数。所以该目录可能是" 007A Raby"并且传递给MoveTo的新名称将是" 007 Raby"。有人对我做错了什么有任何想法吗?

    private void RenameSubs(string directory)
    {
        try
        {
            if (Directory.Exists(directory))
            {
                var parentDI = new DirectoryInfo(directory);

                foreach (var di in parentDI.GetDirectories())
                {
                    var spaceLocation = di.Name.IndexOf(' ');
                    var changed = false;

                    if (spaceLocation > 0)
                    {
                        var oldName = di.Name;
                        var subPartA = di.Name.Substring(0, spaceLocation);
                        var subPartB = di.Name.Substring(spaceLocation, di.Name.Length - spaceLocation);

                        for (int i = subPartA.Length - 1; i > 0; i--)
                        {
                            if (subPartA[i] < '0' || subPartA[i] > '9')
                            {
                                subPartA = subPartA.Substring(0, i);
                                changed = true;
                            }
                            else
                            {
                                break;
                            }
                        }

                        if (changed)
                        {
                            if (!Directory.Exists(Path.Combine(directory, subPartA + subPartB)))
                            {
                                var newName = subPartA + subPartB;
                                di.MoveTo(newName);
                                txtOutput.Text += "Renamed " + oldName + " to " + di.Name + "\r\n";
                            }
                            else
                            {
                                txtOutput.Text += "Error " + oldName + " already exists " + "\r\n";
                            }
                        }
                        else
                        {
                            txtOutput.Text += "Ignored " + di.Name + "\r\n";
                        }
                    }
                }
            }   
        }
        catch (System.Exception excpt)
        {
            txtOutput.Text += "Error " + excpt.Message + "\r\n";
            Console.WriteLine(excpt.Message);
        }
    }

1 个答案:

答案 0 :(得分:0)

好的,经过反复试验后,我想出了如何修复它。当“相对路径”传递到DirectoryInfo.MoveTo时,它不使用父路径而是使用应用程序路径。因此,当我说它工作,因为它与我错过的应用程序在同一个驱动器上,它将文件夹重命名为应用程序文件夹。为了解决这个问题,我需要传递一个MoveTo方法的绝对路径。下面是“if(changed)”代码块中需要进行代码更改才能完成这项工作:

    var newName = Path.Combine(directory, subPartA + subPartB);

    if (!Directory.Exists(newName))
    {
        di.MoveTo(newName);
        txtOutput.Text += "Renamed " + oldName + " to " + di.Name + "\r\n";
    }
    else
    {
        txtOutput.Text += "Error " + oldName + " already exists " + "\r\n";
    }

希望这有助于其他人。