Введение
Чтобы воспроизвести вашу проблему, я создал следующий метод:
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
не меняет этого. Странно!
Решение
Если я реализую 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
, если не знаете, что делаете! Обычно вам не нужно вызывать этот метод.