Problème de performance lors du déplacement des fichiers sur les partages réseau
-
27-09-2019 - |
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
La solution
J'ignorer les fonctions API shell et utilisez MoveFileEx
ou MoveFileWithProgress
directement.