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

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

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

        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);
        }

5 ответов


Как указывалось в обоих предыдущих ответах, каталог назначения не может существовать. В коде вы создаете каталог, если он не существует, а затем пытаетесь переместить каталог, метод 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();
    }
}

вам не нужно сначала создавать каталог, он вызовет исключение ввода-вывода, если целевой каталог существует,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


от 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"."


по состоянию на MSDN,

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

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

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

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

to

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

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

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

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

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