Переименование каталога с тем же именем в другом регистре - PullRequest
8 голосов
/ 26 октября 2009

Я пытаюсь переименовать каталог в c # на имя, которое совпадает только с другим регистром.

Например: f: \ test to f: \ TEST

Я пробовал этот код:

var directory = new DirectoryInfo("f:\\test");
directory.MoveTo("f:\\TEST");

и я получаю IOException - источник и путь назначения должны отличаться. Я также пробовал Directory.Move () с тем же результатом.

Как это сделать? Нужно ли создавать отдельный временный каталог, перемещать содержащиеся в нем файлы из исходного каталога во временный каталог, а затем удалять исходный и переименовывать временный каталог?

Ответы [ 4 ]

11 голосов
/ 26 октября 2009

Ну, вам не нужно создавать отдельный каталог и перемещать все. Просто переименуйте папку во что-то другое и затем вернитесь к нужному имени:

var dir = new DirectoryInfo(@"F:\test");
dir.MoveTo(@"F:\test2");
dir.MoveTo(@"F:\TEST");
1 голос
/ 11 августа 2016

Даже если метод .NET DirectoryInfo.MoveTo выдает исключение, если имя совпадает, вы можете вызвать такую ​​функцию Windows API MoveFile, чтобы установить регистр имени каталога: 1005 *

bool success = MoveFile(dirInfo.FullName, dirInfo.FullName);

С этим внешним объявлением:

[DllImport("kernel32", SetLastError = true)]
private static extern bool MoveFile(string lpExistingFileName, string lpNewFileName);

У меня нормально работает, если имя отличается только регистром. Я не пробовал называть это так, когда имя уже точно соответствует указанному.

Это имеет то преимущество, что каталог никогда не исчезает под своим первоначальным именем.

Он имеет тот недостаток, что работает только в Windows.

1 голос
/ 26 октября 2009

Почему бы не переименовать каталог temp, а затем снова переименовать в TEST?

0 голосов
/ 26 октября 2009

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

...