【问题标题】:DirectoryInfo.MoveTo - "Source and destination path must have identical roots. Move will not work across volumes."DirectoryInfo.MoveTo -“源路径和目标路径必须具有相同的根。移动无法跨卷工作。”
【发布时间】:2014-10-24 23:16:03
【问题描述】:

我试图弄清楚这里发生了什么。我有一个例程,它查看目录中的所有目录并从目录名称的第一部分删除任何非数值。出于某种原因,当它执行 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);
        }
    }

【问题讨论】:

  • 您可以发布几行代码来复制错误(源和目标路径必须具有相同的根。移动将无法跨卷。)而不是让我们阅读所有不相关的代码。发个SSCCE怎么样
  • 使用调试器查看newName的值。我敢打赌,这不是你所期望的。还有一个更一般的注意事项:使用System.IO.Path 类来操作目录和文件名(而不是直接字符串操作);看在上帝的份上,不要将 bool 表达式与文字进行比较...我的意思是,它是合法的并且有效,但它的可读性不如写 if (!Directory.Exists(...))
  • Peter,我已经运行了调试器,newName 正是我所期望的“007 Raby”,而 di.Name 属性是“007A Raby”。我不会争论 Exists == false 的可读性,但是比较文字如何?
  • LB,我认为这是一个小的 SSCCE,因为我认为是合适的。我的猜测是这与从 GetDirectories 返回的集合有关,因为我已经运行了一个小样本,该样本仅使用单个 di 来执行相同的操作并且无法复制问题。所以我觉得有必要包括我所做的一切。
  • 因此,通过更多测试,失败与应用程序路径和目录位置有关。只要我将其指向应用程序运行的同一驱动器,上面的代码就可以工作。但是一旦目录指向另一个驱动器,它就会失败。

标签: c# directoryinfo


【解决方案1】:

好的,经过反复试验,我想出了如何解决它。当“相对路径”被传递到 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";
    }

希望这对其他人有所帮助。

【讨论】:

    猜你喜欢
    • 2021-05-27
    • 2017-05-17
    • 2013-08-28
    • 1970-01-01
    • 1970-01-01
    • 2017-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多