Emissão de desempenho ao mover de arquivos em compartilhamentos de rede
-
27-09-2019 - |
Pergunta
Estou escrevendo um aplicativo que pode copiar arquivos em um compartilhamento de rede. Normalmente, os arquivos são movidos no mesmo disco rígido físico. Se você testar isso com o Windows Explorer, esta operação será executada muito rapidamente. Parece que o Windows conhece o mesmo local e faz um movimento real e não uma cópia e exclusão (que seria mais lenta).
Digamos que você queira copiar um conjunto de arquivos:
\\computer\share\fileA.txt
\\computer\share\fileB.txt
O destino é, por exemplo:
\\computer\share\subfolder
O aplicativo usa a API do Windows Shell (escrevi o aplicativo em Delphi, mas o problema também deve ser o mesmo para outros idiomas):
with SHFileOpStruct do
begin
Wnd := 0;
wFunc := FO_MOVE;
pFrom := PChar ('\\computer\share\fileA.txt'+#0
+'\\computer\share\fileB.txt'+ #0#0);
pTo := PCahr ('\\computer\share\subfolder' + #0#0);
fFlags := FOF_SILENT or FOF_NOCONFIRMATION;
end;
Result := SHFileOperationW (SHFileOpStruct);
Infelizmente, esse código faz uma "cópia e exclusão", que é muito mais lenta em arquivos grandes ou se você tiver muitos arquivos. Como posso evitar isso? Existe alguma maneira de dizer à operação de movimento que as pastas estão no mesmo disco rígido? Talvez haja outra notação para o caminho da rede.
Ou existe uma função API diferente que é usada pelo Windows Explorer?
Para uma breve comparação:
- Número de arquivos: 260
- Tamanho do arquivo para cada um dos arquivos: 11 KB
- Hora de mudar no Explorer: 2 s
- Hora de mover -se com Shfileoperation: 20 segundos
Estou usando o Windows 7 no meu sistema de desenvolvimento, mas também deve funcionar no XP, para que eu não possa usar a nova interface do ifileoperation.
Atenciosamente
Solução
Eu ignoraria as funções da API do shell e usaria MoveFileEx
ou MoveFileWithProgress
diretamente.