Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Über Laufwerke verschieben - MoveFileEx geht nicht? (https://www.delphipraxis.net/132655-ueber-laufwerke-verschieben-movefileex-geht-nicht.html)

blackdrake 16. Apr 2009 23:26


Über Laufwerke verschieben - MoveFileEx geht nicht?
 
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

jaenicke 16. Apr 2009 23:37

Re: Über Laufwerke verschieben - MoveFileEx geht nicht?
 
Ich habe dafür immer SHFileOperation verwendet, damit ging das auch unter Windows 95 problemlos:
http://msdn.microsoft.com/en-us/library/bb762164.aspx

MoveFileEx müsste ich einmal testen, virtuell habe ich alle Systeme von 95 bis XP noch da, vielleicht sehe ich ja etwas.

// EDIT:
MoveFileEx ist unter Windows 95, 98 und ME nicht verfügbar, erst unter Windows NT. MS hat ja die Dokumentation zu Windows 9x herausgenommen, aber in der älteren Version stand:
Zitat:

Windows 95 and Windows 98: The MoveFileEx function is not supported.
Zudem ist die Funktion ja eher dafür gedacht Dateien zu verschieben, die gerade in Benutzung sind, soweit ich das sehe.

Fridolin Walther 17. Apr 2009 09:02

Re: Über Laufwerke verschieben - MoveFileEx geht nicht?
 
Zitat:

Zitat von blackdrake
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!

Also bei mir stehts eindeutig drin:
http://msdn.microsoft.com/en-us/library/aa365240(VS.85).aspx

Zitat:

Minimum supported client: Windows 2000 Professional

jaenicke 17. Apr 2009 09:17

Re: Über Laufwerke verschieben - MoveFileEx geht nicht?
 
Richtig, allerdings steht das nicht mehr überall korrekt dabei, teilweise gab es die Funktionen doch schon früher, aber die Doku wird wohl (verständlicherweise) für Windows 9x nicht mehr richtig gepflegt.

Nebenbei kannst du das "(VS.85)" einfach aus der URL löschen, dann funktioniert der Link.

blackdrake 18. Apr 2009 13:56

Re: Über Laufwerke verschieben - MoveFileEx geht nicht?
 
OK, das dürfte es erklären. Ich versuche dann mal die alternative Möglichkeit.

Seltsam, in der Delphi 7 Win32-Hilfe war überhaupt nichts über die Verfügbarkeit von MoveFileEx beschrieben. Es wurde ja wie gesagt sogar beschrieben, was ausschließlich unter NT funktioniert (z.B. das Reboot-Zeug). Dann muss man doch davon ausgehen, dass wenn es NT-Exklusive-Flags gibt, der Rest unter 9x funktionieren muss. Sehr seltsam geschrieben...

jaenicke 18. Apr 2009 14:06

Re: Über Laufwerke verschieben - MoveFileEx geht nicht?
 
Die mitgelieferte Hilfe ist höchstens ein Anhaltspunkt, die richtige MSDN Doku ist das entscheidende.

blackdrake 19. Apr 2009 01:26

Re: Über Laufwerke verschieben - MoveFileEx geht nicht?
 
Mh... irgendwie sind die Requirements Informationen in der MSDN seltsam - sie scheinen sich irgendwie nach dem Produktlebenszyklus zu orientieren und entsprechen damit nicht der ganzen Wahrheit.

Ich habe mir einfach mal MoveFile angeschaut und dort steht:

Zitat:

Minimum supported client
Windows 2000 Professional

Minimum supported server
Windows 2000 Server
Stimmt doch gar nicht. MoveFile gibt es doch ab 95/NT... :wiejetzt:

jaenicke 19. Apr 2009 01:41

Re: Über Laufwerke verschieben - MoveFileEx geht nicht?
 
Richtig, wie ich sagte:
Zitat:

Zitat von jaenicke
Richtig, allerdings steht das nicht mehr überall korrekt dabei, teilweise gab es die Funktionen doch schon früher, aber die Doku wird wohl (verständlicherweise) für Windows 9x nicht mehr richtig gepflegt.

Das man mit Delphi 2009 ohnehin keine Programme mehr für Win9x schreiben kann, konzentriere ich mich darauf auch nicht mehr, aber aufgefallen ist es mir schon mal.

Es gibt zu Visual Studio ja auch die MSDN Dokumentation, da steht das auch noch für Win9x korrekt drin glaube ich, müsste ich mal schauen, wie das war.

Christian Seehase 19. Apr 2009 03:14

Re: Über Laufwerke verschieben - MoveFileEx geht nicht?
 
Zitat:

Zitat von jaenicke
Es gibt zu Visual Studio ja auch die MSDN Dokumentation, da steht das auch noch für Win9x korrekt drin glaube ich, müsste ich mal schauen, wie das war.

Also bei meinem, 2008 Express, steht in der lokalen Hilfe auch nur, dass es diese Funktion(en) ab Windows 2000 gibt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:11 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz