【发布时间】: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