Переименование каталога с тем же именем в другом регистре
Вопрос
Я пытаюсь переименовать каталог в c # на имя, которое совпадает только с другим регистром.
Например: f: \ test to f: \ TEST
Я пробовал этот код:
var directory = new DirectoryInfo("f:\\test");
directory.MoveTo("f:\\TEST");
и я получаю IOException - источник и путь назначения должны отличаться. Я также пробовал Directory.Move () с тем же результатом.
Как это сделать? Нужно ли создавать отдельный временный каталог, перемещать содержащиеся в нем файлы из исходного каталога во временный каталог, а затем удалять исходный каталог и переименовывать временный каталог?
Решение
Ну, вам не нужно создавать отдельный каталог и перемещать все. Просто переименуйте папку во что-то другое, а затем вернитесь к нужному имени:
var dir = new DirectoryInfo(@"F:\test");
dir.MoveTo(@"F:\test2");
dir.MoveTo(@"F:\TEST");
Другие советы
Почему бы не переименовать каталог temp
, а затем снова переименовать в TEST
?
Даже если метод .NET DirectoryInfo.MoveTo
выдает исключение, если имя совпадает, вы можете вызвать Windows API MoveFile
позволяет установить регистр имени каталога:
bool success = MoveFile(dirInfo.FullName, dirInfo.FullName);
С этим объявлением extern:
[DllImport("kernel32", SetLastError = true)]
private static extern bool MoveFile(string lpExistingFileName, string lpNewFileName);
У меня нормально работает, если имя отличается только регистром. Я не пробовал называть это так, когда имя уже точно соответствует указанному.
Преимущество этого заключается в том, что каталог никогда не исчезает под своим первоначальным именем.
Он имеет тот недостаток, что работает только в Windows.
В этом случае ответ положительный - сама файловая система не видит эти два отличия, поэтому вам нужно удалить и добавить как новое имя (или переместить / удалить / переместить, как вы предложили) р>