Перемещение папки (каталога) из одного места в другое - неправильное поведение - PullRequest
3 голосов
/ 09 сентября 2011

Я хочу переместить каталог из одного места в другое, используя C # .NET.Я использовал Directory.Move или даже DirectoryInfo (с MoveTo) следующим простым способом:

// source is: "C:\Songs\Elvis my Man"
// newLocation is: "C:\Songs\Elvis"

try
{
    // Previous command was: Directory.Move(source, newLocation);
    DirectoryInfo dir = new DirectoryInfo(source);
    dir.MoveTo(newLocation);
}
catch (Exception e)
{
    Console.WriteLine("Error: "+ e.Message);
}

Но выполняемое действие (в обоих случаях) - переименование имени папки из «source» в «newLocation»

Что я ожидал? эта папка "Элвис мой человек" теперь будет в папке "Элвис".

Что имеетслучилось? "Элвис мой человек" был изменен на "Элвис" (переименован).Если каталог «Элвис» уже существует, он не может изменить его на «Элвис» (потому что он не может сделать дубликаты имен), поэтому я получаю исключение, сообщающее, что.

Что я делаюнеправильно ??

Большое спасибо !!!

Ответы [ 4 ]

6 голосов
/ 09 сентября 2011

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

Мне всегда было проще избегать исключений, чем обрабатывать их, как только они возникают.

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

Вот пример кода для вас:

            string sourceDir = @"c:\test";
        string destinationDir = @"c:\test1";

        try
        {
            // Ensure the source directory exists
            if (Directory.Exists(sourceDir) == true )
            {
                // Ensure the destination directory doesn't already exist
                if (Directory.Exists(destinationDir) == false)
                {
                    // Perform the move
                    Directory.Move(sourceDir, destinationDir);
                }
                else
                {
                    // Could provide the user the option to delete the existing directory
                    // before moving the source directory
                }
            }
            else
            {
                // Do something about the source directory not existing
            }
        }
        catch (Exception)
        {
            // TODO: Handle the exception that has been thrown
        }
3 голосов
/ 09 сентября 2011

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

Таким образом, вам нужно изменить newLocation на "C: \ Songs \ Elvis \ Elvis my Man", чтобы сделать эту работу.

2 голосов
/ 09 сентября 2011

С MSDN ,

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

Похоже, вам нужно установить newLocation в C: \ Songs \ Elvis \ Elvis my man

0 голосов
/ 12 июля 2018
    private void moveDirectory(string fuente,string destino)
    {
        if (!System.IO.Directory.Exists(destino))
        {
            System.IO.Directory.CreateDirectory(destino);
        }
        String[] files = Directory.GetFiles(fuente);
        String[] directories = Directory.GetDirectories(fuente);
        foreach (string s in files)
        {
            System.IO.File.Copy(s, Path.Combine(destino,Path.GetFileName(s)), true);     
        }
        foreach(string d in directories)
        {

            moveDirectory(Path.Combine(fuente, Path.GetFileName(d)), Path.Combine(destino, Path.GetFileName(d)));
        }

    }
...