2012-06-15 3 views
2

Предположим, у меня есть Directory 1 и Directory 2, и у каждого из них могут быть файлы или подкаталоги внутри них. То, что я до сих пор есть, если я хочу, чтобы переименовать «Справочник 2» в «Каталог 3», я могу запустить:C# Переименовать каталог, скопировать все содержимое Если каталог уже существует

Directory.Move("path\Directory 2", "path\Directory 3"); 

Это прекрасно работает - переименовывает каталог, все подкаталоги и файлы в этом рабочем каталоге штрафа с новым именем, без копий.

Однако, если я пытаюсь сделать это:

Directory.Move("path\Directory 2", "path\Directory 1"); 

Я получаю сообщение об ошибке, потому что каталог 1 уже существует. В этом случае, если Directory 2 не сможет быть переименован в каталог 1, все содержимое (файлы и подкаталоги) в Каталоге 2 должно просто переместиться в каталог 1. Какой самый простой способ сделать это? Должен ли я иметь файл if, foreach для перемещения всех подкаталогов и foreach для перемещения всех файлов? Есть ли более простой способ перегрузить функцию .Move для перемещения файлов независимо от ошибок существования?

ответ

3

Нет, поскольку MOVE работает на уровне файловой системы, эффективно переименовывает папку или перемещает папку «указатель» в другое место. Бывший - это случай, когда родительские каталоги одинаковы, а последние - в случае, когда родительские каталоги различаются.

Итак, отвечая на ваш прямой вопрос, вам нужно будет указать каждый дочерний каталог в случае, если цель существует и что-то в ней. Если это не так, вы всегда можете удалить его и перейти с помощью MOVE-ing.

Посмотрите здесь: Directory.Move doesn't work (file already exist)

+0

Так в принципе, хорошая стратегия может быть, чтобы сделать функцию, которая выполняет следующее: Если (папка не существует) -> просто использовать .move Если (папка существует) -> запустить функцию на каждом подкаталоге Таким образом, я могу рекурсивно переименовать каждый каталог и подкаталог, и если они уже существуют, просто переместите материал внутри. Правильно ли это? – Jake

+0

Несомненно, посмотрите связанную статью, у нее уже есть одна :) –

+0

Хе-хе, это намного проще! Благодаря! – Jake

0

Я хотел бы сделать это следующим образом:

if(Directory.Exists(destinationPath)) 
{ 
    Directory.Delete(destionatPath, true /* recusively nuke everything */); 
} 

Directory.Move(sourcePath, destinationPath); 
+0

Я предпочитаю не удалять существующий путь, просто добавьте к нему файлы – Jake

+0

Это было бы совсем по-другому. – bluevector

0

Вы не можете использовать метод Directory.Move, чтобы переместить файлы в существующие папки. Вы должны переместить файлы вручную в этом случае, например, используя цикл foreach на уровне файла. Directory.Move работает только в том случае, если целевой каталог не выходит. Однако вы можете проверить, существует ли каталог, или попробовать его, и обработать исключение IOException, чтобы вы делали foreach только в случае необходимости.

Смежные вопросы