Перемещение файлов на разные тома в .NET

По-видимому, я не могу перемещать файлы на разные тома с помощью Directory.Move.

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

Есть ли у меня другой вариант?


person Blankman    schedule 18.12.2008    source источник


Ответы (4)


Независимо от того, выполняет ли Directory.Move (или любая другая функция) перемещение между томами, по сути, это будет копирование и удаление внизу. Так что, если вы хотите увеличить скорость, этого не произойдет. Я думаю, что лучшим решением было бы написать свою собственную многоразовую функцию перемещения, которая получала бы метку тома (C:,D:) из пути туда и обратно, а затем либо выполняла перемещение, либо копировала+удаляла при необходимости.

person Kibbee    schedule 18.12.2008

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

 public void removeReadOnlyDeep(string directory)
    {
        string[] files = Directory.GetFiles(directory);
        foreach (string file in files)
        {
            FileAttributes attributes = File.GetAttributes(file);
            if ((attributes & FileAttributes.ReadOnly) != 0)
            {
                File.SetAttributes(file, ~FileAttributes.ReadOnly);
            }
        }
        string[] dirs = Directory.GetDirectories(directory);
        foreach (string dir in dirs)
        {
            removeReadOnlyDeep(dir);
        }
    }

это рекурсирует каталог и сбрасывает все флаги только для чтения. Звонить перед Directory.Delete :)

person Martijn Laarman    schedule 18.12.2008

Более простым вариантом было бы добавить ссылку на пространство имен Microsoft.VisualBasic и использовать метод MoveDirectory, который может перемещаться по томам.

Microsoft.VisualBasic.FileIO.FileSystem.MoveDirectory(sourceDirName, destDirName);
person NePh    schedule 14.07.2016

Попробуйте использовать это:

public static void RobustMove(string sourceDirectory, string destDirectory)
{
    //move if directories are on the same volume
    if (Path.GetPathRoot(source) == Path.GetPathRoot(destination))
    {
        Directory.Move(source, destination);
    }
    else
    {        
        CopyDirectoryRecursive(source, destination);
        Directory.Delete(source, true);
    }
}

Вы найдете функцию CopyDirectoryRecursive здесь:

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

Чтобы быть еще более надежной, вы можете улучшить эту функцию, чтобы использовать Move до тех пор, пока System.IO .Exception не будет выброшено, а затем переключиться на копирование и удаление.

person Tomas Kubes    schedule 04.07.2017