我试图弄清楚这里发生了什么。我有一个例程,查看目录中的所有目录,并从目录名的第一部分删除任何非数字值。出于某种原因,当它去做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);
}
}
答案 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";
}
希望这有助于其他人。