介绍
为了重现您的问题,我创建了以下方法:
private static string RenameFolder(string path, string newFolderName)
{
DirectoryInfo di = new DirectoryInfo(path);
DirectoryInfo parent = Directory.GetParent(di.FullName);
String newPath = Path.Combine(parent.FullName, newFolderName);
// rename to some temp name, to help change lower and uppercast names
di.MoveTo(newPath + "__renameTemp__");
di.MoveTo(newPath);
return di.FullName;
}
当我像下面这样调用它时,它会起作用:
var path = @"C:\Temp\test";
var newPath = RenameFolder(path, "TESt");
newPath = RenameFolder(path, "Test1");
当我像下面这样调用它时,它不起作用:
var path = @"C:\Temp\test";
var newPath = RenameFolder(path, "TESt");
newPath = RenameFolder(newPath, "Test1");
两个调用之间的唯一区别是,在第一个版本中,我传递原始名称,即所有内容均为小写。在第二种情况下,我提供新名称,即除最后一个字母外的所有内容均为大写。甚至在两次通话之间睡了 20 秒RenameFolder
并没有改变这一点。奇怪的!
Solution
如果我实施RenameFolder
像这样,它在两种情况下都有效:
private static string RenameFolder(string path, string newFolderName)
{
String newPath = Path.Combine(Path.GetDirectoryName(path), newFolderName);
// rename to some temp name, to help change lower and uppercast names
Directory.Move(path, newPath + "__renameTemp__");
Directory.Move(newPath + "__renameTemp__", newPath);
return newPath;
}
不知何故,DirectoryInfo
似乎在路径上有一个区分大小写的锁。
解释
我没有,也许有人对内部方式有更多的了解DirectoryInfo
可以阐明这种奇怪的行为。
很重要的一点
不要使用GC.Collect
如果你不知道,你在做什么!通常情况下,你don't需要调用这个方法。