Pergunta

Aparentemente eu não posso mover arquivos em diferentes volumes usando Directory.Move.

Eu li que eu tenho que copiar cada arquivo individualmente para o destino, em seguida, excluir o diretório de origem.

Eu tenho outra opção?

Foi útil?

Solução

Independentemente de estarem ou não Directory.Move (ou qualquer outra função) realizaram o movimento entre os volumes, que seria, essencialmente, fazer uma cópia e apagar qualquer maneira por baixo. Então se você quer um aumento de velocidade, isso não vai acontecer. Acho que a melhor solução seria a de escrever sua própria função movimento reutilizável, que iria receber o rótulo de volume (C:., D :) do de e para caminhos, e então realizar um movimento, ou copiar + delete quando necessário

Outras dicas

Para o meu conhecimento não há nenhuma outra maneira no entanto excluir um diretório tem um problema: Read Only arquivos pode causar um Greeve UnauthorizedAccessException ao excluir um diretório e todo o seu conteúdo

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

este recurses um diretório e desactiva toda a ler apenas bandeiras. Chamada antes Directory.Delete:)

Uma opção mais fácil seria, para adicionar uma referência ao namespace Microsoft.VisualBasic e usar o método MoveDirectory, que pode mover-se através volumes.

Microsoft.VisualBasic.FileIO.FileSystem.MoveDirectory(sourceDirName, destDirName);

Tente usar este:

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

Você vai encontrar a função CopyDirectoryRecursive aqui :

Isto deve ser trabalhar até que você use volume ou símbolo ligações estendidos para outro disco físico.

Para ser ainda mais robusto pode melhorar esta função para usar o movimento até System.IO .Exception é lançada e, em seguida, para mudar para copiar e excluir.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top