Einzelnen Beitrag anzeigen

blackdrake

Registriert seit: 22. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#1

Über Laufwerke verschieben - MoveFileEx geht nicht?

  Alt 17. Apr 2009, 00:26
Hallo.

Ich habe heute die Win32 Hilfe angeschaut und bin über folgenden Hinweis bei der API-Funktion MoveFile() gestoßen:

Zitat:
The one caveat is that the MoveFile function will fail on directory moves when the destination is on a different volume.
Dies bringt mich in Aufruhr, da ich MoveFile() zum Verschieben von Dateien und Verzeichnisse brauche und eine Verschiebung auch über Laufwerke hinweg funktionieren sollte.

Ich habe zuerst einmal eine MyMoveFile() Funktion entworfen, die zuerst CopyFile() und dann eine eigene RemoveDirectoryRecursive() aufruft. Das Problem: CopyFile() will nur Dateien.

Dann habe ich die einfachere Variante MoveFileEx() gefunden. Mithilfe von MOVEFILE_COPY_ALLOWED soll auch das Verschieben über Laufwerke hinweg funktionieren, in dem Copy + Delete durchgeführt wird.

Mein Code ist nun:

Delphi-Quellcode:
if not MoveFileEx('A:\test2\', 'C:\test2\', MOVEFILE_COPY_ALLOWED) then
begin
  RaiseLastOSError;
end;
Das Problem: In Windows ME funktioniert es entgegen meiner Erwartung nicht. (Bitte jetzt keine Diskussion, ob es sinnvoll ist, ein 9 Jahre altes OS zu verwenden... Da ich eine bodenständige Konsolenanwendung schreibe, möchte ich bis 95 kompatibel bleiben.)

Ich erhalte den OS-Error 120: "Die Funktion wird von diesem System nicht unterstützt." (ERROR_CALL_NOT_IMPLEMENTED). Wieso das?? In der Win32 API Reference wird nichts darüber geschrieben, dass MoveFileEx() in Windows 9x/ME nicht funktionieren soll! Ganz im Gegenteil - es werden sogar die Windows 95 Kompatibilitätsgrenzen bei MoveFileEx dokumentiert. Es steht beispielsweise dort, dass z.B. Reboot-Verschiebungen nur mit NT funktionieren. Alles Andere sollte laut Anleitung mit 9x/ME funktionieren.

Was soll ich jetzt tun, damit ich ein Verzeichnis über Laufwerke hinweg verschieben kann und was soll der Code 120 hier bedeuten?

Gruß
blackdrake
Daniel Marschall
  Mit Zitat antworten Zitat