AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Pfadinhalte eine Ebene aufwärts kopieren
Thema durchsuchen
Ansicht
Themen-Optionen

Pfadinhalte eine Ebene aufwärts kopieren

Ein Thema von zeras · begonnen am 18. Sep 2018 · letzter Beitrag vom 20. Sep 2018
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.688 Beiträge
 
Delphi 12 Athens
 
#1

AW: Pfadinhalte eine Ebene aufwärts kopieren

  Alt 18. Sep 2018, 15:44
Mit MoveFile (TDirectoy.Move) lässt sich ein Verzeichnis nicht in ein bereits bestehendes verschieben.
Wenn ich das richtig sehe, wendet TDirectory.Move in Delphi 10.2 Tokyo das RenameFile/MoveFile nur auf Dateien an, nicht auf Verzeichnisse.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Rolf Frei

Registriert seit: 19. Jun 2006
655 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Pfadinhalte eine Ebene aufwärts kopieren

  Alt 18. Sep 2018, 17:20
Mit MoveFile (TDirectoy.Move) lässt sich ein Verzeichnis nicht in ein bereits bestehendes verschieben.
Wenn ich das richtig sehe, wendet TDirectory.Move in Delphi 10.2 Tokyo das RenameFile/MoveFile nur auf Dateien an, nicht auf Verzeichnisse.
Ja weil die Windows API MoveFile nur mit nicht existierenden Zielverzeichnissen arbeitet. Für diesen Fall wird in
TDirectory.CheckMoveParameters überprüft, ob das Zielverzeichnis schon besteht. Wenn ja, wird eine Exception ausgelöst. Das ist das Problem das der TE hat. Er will das Verzeihnis/Inhalt von c:\temp\alt in das Verzeichnis c:\temp\alt\.. (also c:\temp) verschieben. c:\temp exisistiert aber bereits und löst daher die Exception aus.

Im Prinzip macht TDirectoy.Move mehr oder weniger das, was ich mit meinen beiden obigen Routinen mache, also Kopieren und Löschen, aber leider geht das hier nicht auf ein bestehendes Verzeichnis, wodurch diese Funktion für die gewünschte Aufgabe nutzlos ist. Mit den von mir oben geposteten Routinen geht das problemlos.

Geändert von Rolf Frei (18. Sep 2018 um 17:48 Uhr)
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.653 Beiträge
 
Delphi 12 Athens
 
#3

AW: Pfadinhalte eine Ebene aufwärts kopieren

  Alt 18. Sep 2018, 18:29
Danke an Allen.

Ich wollte in neuen Projekten auch einmal die neuen Klassen verwenden (TFILE, TPAH, etc.). Aber anscheinend läßt sich mein Problem nur mittels der Funktionen von Rolf lösen.
Danke Rolf.
Ich habe verschiedene Ansätze von euch probiert, aber immer kommt die Meldung, dass ein Pfad schon vorhanden sei. Ist er ja auch. Aber warum sollte man nicht alle Verzeichnisse und Dateien eine Ebene aufwärts verschieben können. Möglicherweise noch ein Denkfehler von Emba oder MS.
Matthias
Es ist nie falsch das Richtige zu tun!
- Mark Twain
  Mit Zitat antworten Zitat
old7
(Gast)

n/a Beiträge
 
#4

AW: Pfadinhalte eine Ebene aufwärts kopieren

  Alt 18. Sep 2018, 19:09
Für den übergeordneten Ordner sollte doch ein Rename (statt Kopieren+Löschen) reichen, für den verbleibenden Rest dann Rolfs Prozeduren, oder?
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Pfadinhalte eine Ebene aufwärts kopieren

  Alt 18. Sep 2018, 19:18
Delphi-Quellcode:
function MoveDir(SrcDir, DstDir: string): Boolean;
var
  FOS: TSHFileOpStruct;
begin
  ZeroMemory(@FOS, SizeOf(FOS));
  with FOS do
  begin
    wFunc := FO_MOVE; // FO_COPY;
    fFlags := FOF_ALLOWUNDO or FOF_SIMPLEPROGRESS;
    pFrom := PChar(IncludeTrailingPathDelimiter(SrcDir) + '*.*'#0);
    pTo := PChar(DstDir + #0);
  end;
  Result := (SHFileOperation(FOS) = 0);
end;
Versuche das mal.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
old7
(Gast)

n/a Beiträge
 
#6

AW: Pfadinhalte eine Ebene aufwärts kopieren

  Alt 18. Sep 2018, 19:28
Danke, aber ich hatte das Problem noch nicht. War nur eine theoretische Überlegung von mir, da Umbenennen bei großen Dateien platten-/SSDschonender ist (und vermutlich auch schneller).
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Pfadinhalte eine Ebene aufwärts kopieren

  Alt 18. Sep 2018, 19:43
Danke, aber ich hatte das Problem noch nicht. War nur eine theoretische Überlegung von mir, da Umbenennen bei großen Dateien platten-/SSDschonender ist (und vermutlich auch schneller).
Hallo old7, Verzeihung ein Missverständnis, meine Antwort galt dem TE und nicht Deiner Frage.
Also die Variante die ich zeigte ist dieselbe die Windows einsetzt.
Um auf Dich einzugehen, Ja ein "Move/Bewegen" ist schonender und schneller wenns das gleiche Laufwerk/Partition betrifft, ansonsten ist es egal.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Rolf Frei

Registriert seit: 19. Jun 2006
655 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Pfadinhalte eine Ebene aufwärts kopieren

  Alt 19. Sep 2018, 12:08
Danke an Allen.

Ich wollte in neuen Projekten auch einmal die neuen Klassen verwenden (TFILE, TPAH, etc.). Aber anscheinend läßt sich mein Problem nur mittels der Funktionen von Rolf lösen.
Danke Rolf.
Ich habe verschiedene Ansätze von euch probiert, aber immer kommt die Meldung, dass ein Pfad schon vorhanden sei. Ist er ja auch. Aber warum sollte man nicht alle Verzeichnisse und Dateien eine Ebene aufwärts verschieben können. Möglicherweise noch ein Denkfehler von Emba oder MS.
Man könnte meine Routinen mit gewissen Einschränkungen, die mit IOUtils nicht umsetzbar sind, auf die System.IOUtils Klassen anpassen, wenn man Multiplattformkonform sein möchte. Für mich ist das aber kein Thema und deshalb nutze ich diese Routinen schon seit Jahren so. Ausserdem läuft der Code auf allen Delphiversion und bietet noch viel mehr Möglichkeiten, als das etwas zu einfach umgesetzte TDriectory.Move.

@old7
Er möchte den übergeordneten Order nicht "löschen/umbennen" sondern nur den Inhalt des Untervezeichnisses in den bestehenden Überorder verschieben. Der Inhalt im übergeordneten Order soll dabei nicht verändert werden, also alles was schon besteht soll auch nach dem Move noch vorhanden sein. Zumindest habe ich das so verstanden.

Geändert von Rolf Frei (19. Sep 2018 um 12:16 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#9

AW: Pfadinhalte eine Ebene aufwärts kopieren

  Alt 19. Sep 2018, 12:24
Ich dachte, es ginge ihm erst mal darum den übergeordneten Ordner raus zu bekommen. Wie er dann seine Dateien dahin bekommt, wäre dann ein anderes Problem. Man könnte dann ja auch mit einem Zwischenschritt über einen temporären Ordner gehen. Liegt der in der selben Partition wird ja eh nur der Eintrag im FAT geändert und sie werden nicht physisch verschoben. Was dann auch recht schnell sein sollte.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
old7
(Gast)

n/a Beiträge
 
#10

AW: Pfadinhalte eine Ebene aufwärts kopieren

  Alt 19. Sep 2018, 16:12
@Rolf
Um die Datei
C:\ueber\unter\riesig.mp4 nach
C:\ueber\riesig.mp4
zu verschieben, sollte ein Umbenennen der Datei riesig.mp4 reichen, falls sie noch nicht in C:\ueber vorhanden ist, das meinte ich.

Das hat nichts mit dem "löschen/umbenennen" des übergeordneten Ordners zu tun, da habe ich den TE schon richtig verstanden, siehe Luckie, der übergeordnete Ordner liegt ja immer in der selben Partition, also wird nur der Eintrag in der FAT umbenannt, falls möglich. In diesem Fall kann man sich das Kopieren+Löschen von riesig.mp4 sparen.

Da hast du mein "umbenennen" wohl falsch verstanden
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 17:24 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz