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

War es hilfreich?

Lösung

würde ich die Shell-API-Funktionen ignorieren, und verwenden Sie MoveFileEx oder MoveFileWithProgress direkt an.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top