Question

J'écris une application qui peut copier des fichiers sur un partage réseau. Habituellement, les fichiers sont déplacés sur le même disque dur physique. Si vous testez cela avec l'Explorateur Windows, cette opération sera exécutée très rapidement. Il semble que Windows connaît le même endroit et fait un mouvement réel et non une copie et de suppression (ce qui serait plus lent).

Le mot Let vous voulez copier un ensemble de fichiers:

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

La destination est par exemple:

\\computer\share\subfolder

L'application utilise l'API Windows Shell (je l'ai écrit l'application dans Delphi, mais le problème devrait être la même chose pour d'autres langues):

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

Malheureusement, ce code fait un « copier et supprimer » ce qui est beaucoup plus lent sur de gros fichiers ou si vous avez beaucoup de fichiers. Comment puis-je éviter ça? Est-il possible de dire l'opération de déplacement, que les dossiers sont sur le même disque dur? Peut-être il y a une autre notation pour le chemin réseau.

Ou est-il une fonction API différente qui est utilise par l'Explorateur Windows?

Pour une brève comparaison:

  • nombre de fichiers: 260
  • taille de fichier pour chacun des fichiers: 11 kB
  • temps pour se déplacer dans l'Explorateur: 2 sec
  • temps pour se déplacer avec SHFileOperation: 20 sec

J'utilise Windows 7 sur mon système de développement, mais il devrait également fonctionner sur XP donc je ne peux pas utiliser la nouvelle interface IFileOperation.

Amitiés

Était-ce utile?

La solution

J'ignorer les fonctions API shell et utilisez MoveFileEx ou MoveFileWithProgress directement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top