Переименование каталога с тем же именем в другом регистре

StackOverflow https://stackoverflow.com/questions/1622597

  •  06-07-2019
  •  | 
  •  

Вопрос

Я пытаюсь переименовать каталог в 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.

В этом случае ответ положительный - сама файловая система не видит эти два отличия, поэтому вам нужно удалить и добавить как новое имя (или переместить / удалить / переместить, как вы предложили)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top