Performance-Problem, wenn auf Netzwerkfreigaben von Dateien zu verschieben
-
27-09-2019 - |
Frage
Ich schreibe eine Anwendung, die Dateien auf einer Netzwerkfreigabe kopieren. Normalerweise werden die Dateien auf dem gleichen physischen Festplatte verschoben. Wenn Sie dies mit dem Windows Explorer testen, wird dieser Vorgang sehr schnell ausgeführt werden. Es scheint, dass Windows über die gleiche Stelle kennt und macht eine wirkliche Bewegung und nicht eine Kopie und löschen (die langsamer sein würde).
Angenommen, Sie wollen eine Reihe von Dateien kopieren:
\\computer\share\fileA.txt
\\computer\share\fileB.txt
Das Ziel ist zum Beispiel:
\\computer\share\subfolder
Die Anwendung verwendet den Windows-Shell-API (ich die Anwendung in Delphi geschrieben, aber das Problem sollte auch für andere Sprachen als auch sein):
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);
Leider funktioniert dieser Code eine „Kopie und löschen“, die viel langsamer auf große Dateien ist oder wenn Sie viele Dateien haben. Wie kann ich das vermeiden? Gibt es eine Möglichkeit, den Bewegungsvorgang zu sagen, dass die Ordner auf der gleichen Festplatte sind? Vielleicht gibt es eine andere Schreibweise für den Netzwerkpfad.
Oder gibt es eine andere API-Funktion, die Anwendungen von Windows Explorer ist?
Für einen kurzen Vergleich:
- Anzahl der Dateien: 260
- Dateigröße für jede der Dateien: 11 kB
- Zeit für Bewegung im Explorer: 2 sec
- Zeit für Bewegung mit SHFileOperation: 20 sec
ich Windows 7 auf meinem Entwicklungssystem verwendet wird, aber es sollte auch die Arbeit an XP, so kann ich nicht die neue IFileOperation-Schnittstelle verwenden.
Mit freundlichen Grüßen
Lösung
würde ich die Shell-API-Funktionen ignorieren, und verwenden Sie MoveFileEx
oder MoveFileWithProgress
direkt an.