2010-08-10 6 views
0

J'écris une application capable de 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 ceci avec Windows Explorer, cette opération sera exécutée très rapidement. Il semble que Windows connaisse le même emplacement et fasse un vrai mouvement et non une copie et une suppression (ce qui serait plus lent).Problème de performances lors du déplacement de fichiers sur des partages réseau

Disons que 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 le même pour les 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); 

Unfortu Ce code fait un "copier et supprimer" qui est beaucoup plus lent sur les gros fichiers ou si vous avez beaucoup de fichiers. Comment puis-je éviter ça? Y at-il un moyen de dire l'opération de déplacement, que les dossiers sont sur le même disque dur? Il existe peut-être une autre notation pour le chemin du réseau.

Ou existe-t-il une autre fonction API utilisée par Windows Explorer?

Pour une brève comparaison:

  • nombre de fichiers: 260 Taille du 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 aussi fonctionner sur XP, donc je ne peux pas utiliser le nouveau I Interface FileOperation.

Amitiés

+0

Cela arrive-t-il également si vous mappez d'abord une lettre de lecteur pour le partage? –

Répondre

1

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

+0

Est-ce que cela résout le problème du chemin réseau? –

+0

@Coco: Je ne suis pas tout à fait sûr si c'est le cas ou non - mais je pensais que ce serait assez rapide/facile à trouver. –

+0

Je vais le tester demain et écrire mes commentaires. MoveFile résout le problème avec –

Questions connexes