Перемещение файлов на разные тома в .NET - PullRequest
5 голосов
/ 18 декабря 2008

Видимо, я не могу переместить файлы на разных томах, используя Directory.Move.

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

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

Ответы [ 4 ]

6 голосов
/ 18 декабря 2008

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

4 голосов
/ 18 декабря 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:)

3 голосов
/ 14 июля 2016

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

Microsoft.VisualBasic.FileIO.FileSystem.MoveDirectory(sourceDirName, destDirName);
0 голосов
/ 04 июля 2017

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

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, а затем переключиться на копирование и удаление.

...