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

Foi útil?

Solução

Eu ignoraria as funções da API do shell e usaria MoveFileEx ou MoveFileWithProgress diretamente.

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