Подтвердить что ты не робот

Невозможно создать файл, если этот файл уже существует при использовании Directory.Move

Я пытаюсь переместить каталог из одного места в другое место на том же диске. Я получаю сообщение " Невозможно создать файл, когда этот файл уже существует". Ниже мой код.

может ли кто-нибудь предложить на это?

        string sourcedirectory = @"F:\source";
        string destinationdirectory = @"F:\destination";

        try
        {
            if (Directory.Exists(sourcedirectory))
            {
                if (Directory.Exists(destinationdirectory))
                {
                  Directory.Move(sourcedirectory, destinationdirectory);
                }
                else
                {
                  Directory.CreateDirectory(destinationdirectory);
                  Directory.Move(sourcedirectory, destinationdirectory);
                }
            }

        }
        catch (Exception ex)
        {
            log(ex.message);
        }
4b9b3361

Ответ 1

Как указывалось в обоих предыдущих ответах, каталог назначения не может существовать. В вашем коде вы создаете каталог, если он не существует, а затем пытается переместить ваш каталог, метод Move создаст для вас каталог. Если каталог уже существует, вам необходимо удалить его или переместить.

Что-то вроде этого:

class Program
{
    static void Main(string[] args)
    {
        string sourcedirectory = @"C:\source";
        string destinationdirectory = @"C:\destination";
        string backupdirectory = @"C:\Backup";
        try
        {
            if (Directory.Exists(sourcedirectory))
            {
                if (Directory.Exists(destinationdirectory))
                {
                    //Directory.Delete(destinationdirectory);
                    Directory.Move(destinationdirectory, backupdirectory + DateTime.Now.ToString("_MMMdd_yyyy_HHmmss"));
                    Directory.Move(sourcedirectory, destinationdirectory);
                }
                else
                {
                    Directory.Move(sourcedirectory, destinationdirectory);
                }
            }

        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        Console.ReadLine();
    }
}

Ответ 2

Вам не нужно сначала создавать каталог, он будет генерировать исключение IO, если каталог назначения существует, метод Move автоматически создает его для вас:

string sourcedirectory = @"F:\source";
string destinationdirectory = @"F:\destination";

if (Directory.Exists(sourcedirectory))
{
    if (!Directory.Exists(destinationdirectory))
    {
         Directory.Move(sourcedirectory, destinationdirectory);
    }
}

Дополнительная информация Directory.Move:

http://msdn.microsoft.com/en-us/library/system.io.directory.move.aspx

Ответ 3

из http://msdn.microsoft.com/en-us/library/system.io.directory.move.aspx

"Этот метод генерирует исключение IOException, если, например, вы пытаетесь переместить c:\mydir в c:\public и c:\public уже существует. Вы должны указать" c:\public\mydir "как destDirName параметр, если" mydir "не существует в разделе" c:\public "или указать новое имя каталога, такое как" c:\newdir".

Ответ 4

По MSDN,

Этот метод генерирует исключение IOException, если, например, вы пытаетесь переместить c:\mydir в c:\public и c:\public уже существует.

Но в вашем методе вы создаете каталог назначения перед перемещением.

Итак, вам нужно изменить свой метод из

if (Directory.Exists(destinationdirectory))
{
  Directory.Move(sourcedirectory, destinationdirectory);
}
else
{
  Directory.CreateDirectory(destinationdirectory);
  Directory.Move(sourcedirectory, destinationdirectory);
}

к

if (Directory.Exists(destinationdirectory))
{
  //delete or rename
}
Directory.Move(sourcedirectory, destinationdirectory);

Ответ 5

Вы можете просто позвонить

Microsoft.VisualBasic.FileIO.FileSystem.MoveDirectory(source, destination, true);

Что он делает внутри, он создает целевой каталог, если он не существует, а затем он выполняет итерацию по файлам исходного каталога и перемещает их в целевой каталог. Таким образом, проблема "Невозможно создать файл, если этот файл уже существует" не будет.

Вам нужно добавить Microsoft.VisualBasic в качестве ссылки.