Domanda

Sto scrivendo un programma che può copiare i file su una condivisione di rete. Di solito i file vengono spostati sullo stesso disco rigido fisico. Se si prova questo con Windows Explorer, questa operazione verrà eseguita molto velocemente. Sembra che Windows sa circa la stessa posizione e fa un vero e proprio movimento e non una copia e di eliminazione (che sarebbe più lento).

diciamo Let si desidera copiare una serie di file:

\\computer\share\fileA.txt
\\computer\share\fileB.txt

La destinazione è per esempio:

\\computer\share\subfolder

L'applicazione utilizza l'API di Windows Shell (ho scritto l'applicazione in Delphi, ma il problema dovrebbe essere lo stesso per le altre lingue oltre):

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

Purtroppo questo codice fa una "copia e cancellare", che è molto più lento a file di grandi dimensioni o se si dispone di un sacco di file. Come posso evitare questo? C'è un modo per raccontare l'operazione di spostamento, che le cartelle sono sullo stesso disco rigido? Forse c'è qualche altra notazione per il percorso di rete.

O c'è una diversa funzione API che è uso da Windows Explorer?

Per un breve confronto:

  • numero di file: 260
  • le dimensioni del file per ciascuno dei file: 11 kB
  • tempo per muoversi in Explorer: 2 sec
  • tempo per movimento con SHFileOperation: 20 sec

Sto usando Windows 7 sul mio sistema di sviluppo, ma dovrebbe funzionare anche su XP in modo da non posso usare la nuova interfaccia IFileOperation.

Cordiali saluti

È stato utile?

Soluzione

mi ignorare le funzioni shell API, e utilizzare MoveFileEx o MoveFileWithProgress direttamente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top