AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Über Laufwerke verschieben - MoveFileEx geht nicht?
Thema durchsuchen
Ansicht
Themen-Optionen

Über Laufwerke verschieben - MoveFileEx geht nicht?

Ein Thema von blackdrake · begonnen am 17. Apr 2009 · letzter Beitrag vom 19. Apr 2009
Antwort Antwort
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
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Über Laufwerke verschieben - MoveFileEx geht nicht?

  Alt 17. Apr 2009, 00:37
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.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Fridolin Walther

Registriert seit: 11. Mai 2008
Ort: Kühlungsborn
446 Beiträge
 
Delphi 2009 Professional
 
#3

Re: Über Laufwerke verschieben - MoveFileEx geht nicht?

  Alt 17. Apr 2009, 10:02
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
Fridolin Walther
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Über Laufwerke verschieben - MoveFileEx geht nicht?

  Alt 17. Apr 2009, 10:17
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.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
blackdrake

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

Re: Über Laufwerke verschieben - MoveFileEx geht nicht?

  Alt 18. Apr 2009, 14:56
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...
Daniel Marschall
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Über Laufwerke verschieben - MoveFileEx geht nicht?

  Alt 18. Apr 2009, 15:06
Die mitgelieferte Hilfe ist höchstens ein Anhaltspunkt, die richtige MSDN Doku ist das entscheidende.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
blackdrake

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

Re: Über Laufwerke verschieben - MoveFileEx geht nicht?

  Alt 19. Apr 2009, 02:26
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...
Daniel Marschall
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: Über Laufwerke verschieben - MoveFileEx geht nicht?

  Alt 19. Apr 2009, 02:41
Richtig, wie ich sagte:
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.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: Über Laufwerke verschieben - MoveFileEx geht nicht?

  Alt 19. Apr 2009, 04:14
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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:31 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