AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Dateien mit Pfad kopieren

Ein Thema von Willie1 · begonnen am 2. Jan 2021 · letzter Beitrag vom 13. Jan 2021
Antwort Antwort
gast2019
(Gast)

n/a Beiträge
 
#1

AW: Dateien mit Pfad kopieren

  Alt 2. Jan 2021, 20:42
https://www.wintotal.de/tipp/xcopy-parameter/

wenn's auch ohne Delphi sein darf

Ein gutes Neues wünsche ich!
  Mit Zitat antworten Zitat
Willie1

Registriert seit: 28. Mai 2008
742 Beiträge
 
Delphi 10.1 Berlin Starter
 
#2

AW: Dateien mit Pfad kopieren

  Alt 3. Jan 2021, 18:09
Hallo, zunächst vielen Dank für eure schnellen Antworten.
Mit TDirectory.Copy(src, dest) geht es, wenn man bei dest den Ordner anhängt. Es gibt keine Exception, auch wenn der Zielordner nicht existiert.
Aber dann müsste es doch auch mit SHFileOperation klappen. Da gibt es Fortschrittsbalken, ich will sehr viele Bilder auf ein langsames Medium (SD) kopieren.
Delphi-Quellcode:
procedure TForm1.Button4Click(Sender: TObject);
var
  dir, pa, fi, s: string;
  i: Integer;
begin
  if SelectDirectory('Zielordner auswhlen','Computer',Dir,[sdNewUI,sdNewFolder]) then begin
    Dir := IncludeTrailingPathDelimiter(Dir);
    for i:=0 to NewList.Count - 1 do begin
      s := ExcludeTrailingPathDelimiter(NewList.GetPath(i));
      s := Copy(s, LastDelimiter('\', s)+1, MAXINT);
      pa := Dir + s + '\';
      fi := NewList.GetPathName(i);
      CopyFiles(pa, fi ,false);
    end;
  end;
end;
Delphi-Quellcode:
 function CopyFiles(DestFolder: string; const Files: array of string; WithConfirm: Boolean;
                     Move: Boolean=false): Boolean;
    var
      SHFOS: TSHFileOpStruct;
      i: Integer;
      s: string;
  begin
    s:='';
    for i:=Low(Files) to High(Files) do s:=s + Files[i] + #0;
    s:=s + #0;
    with SHFOS do begin
      Wnd:=0;
      if Move then wFunc:=FO_MOVE else wFunc:=FO_COPY;
      pFrom:=PChar(s);
      pTo:=PChar(DestFolder);
      fFlags:=FOF_NOCONFIRMATION; //ohne Rückfrage
      if WithConfirm then fFlags:=0;
      fAnyOperationsAborted:=false;
      hNameMappings:=nil;
    end;
    Result:=(ShFileOperation(SHFOS) = 0) and (SHFOS.fAnyOperationsAborted = LongBool(false));
  end; {CopyFiles}
Willie.
Nachtrag: Wenn ich das Kopieren des Ordner mit dem Explorer ausführe, geht es doch auch!
Gut hören kann ich schlecht, schlecht sehen kann ich gut - Ersteres stimmt nicht, das zweite schon.

Geändert von Willie1 ( 3. Jan 2021 um 18:37 Uhr) Grund: Nachtrag
  Mit Zitat antworten Zitat
mmw
(Gast)

n/a Beiträge
 
#3

AW: Dateien mit Pfad kopieren

  Alt 3. Jan 2021, 18:45
hallo,

Delphi-Quellcode:
 for i:=Low(Files) to High(Files) do s:=s + Files[i] + #0;
    s:=s + #0;
wäre es nicht besser so -

Delphi-Quellcode:
  for i:=Low(Files) to High(Files) do begin
     s:=''
     s:=s + Files[i] + #0#0
  CopyFiles(...)
   end;
wäre einfacher der Funktion nur die Datei zu übergeben die kopiert werden soll.

gruß

Geändert von mmw ( 3. Jan 2021 um 20:54 Uhr)
  Mit Zitat antworten Zitat
Willie1

Registriert seit: 28. Mai 2008
742 Beiträge
 
Delphi 10.1 Berlin Starter
 
#4

AW: Dateien mit Pfad kopieren

  Alt 5. Jan 2021, 11:12
Hallo Leute,
ich habe im Explorer schon oft einen Ordner (mit Unterordnern) in ein Verzeichnis eines anderen Laufwerks kopiert, z.B. Delphi-Projekte.
Das muss doch auch programmgesteuert gehen! Mit TDirectory.Copy läuft es nicht. Ich kann zwar einen Unterordner benennen, er wird auch angelegt, aber nicht die gesamte Ordnerstruktur.
Meine Funktion CopyFiles benutze ich seit 15 Jahren.
Ich bin sicher, einer oder mehr von euch wissen, wie es geht.

Übrigens, wünsche ich euch noch ein gutes, neues Jahr.
Willie.
Gut hören kann ich schlecht, schlecht sehen kann ich gut - Ersteres stimmt nicht, das zweite schon.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.553 Beiträge
 
Delphi 12 Athens
 
#5

AW: Dateien mit Pfad kopieren

  Alt 7. Jan 2021, 21:23
Zitat:
Das gibt zwar keine Fehlermeldung
Hast du den auch die Rückgaben geprüft, ob es nicht doch einen Fehler gab?
Von selbst passiert da nix.

Delphi-Referenz durchsuchenTDirectory.GetFiles


Zitat:
SHFOS.fAnyOperationsAborted = LongBool(false)
Niemals mit Booleans vergleichen ... immer nur als Zuweisung.
Ach ja, auch wenn es beim "False" gehen wird, aber beim True knallt es gern schnell.
PS: Es ist schon ein "Bool".

not SHFOS.fAnyOperationsAborted


Ach ja, ist denn bei einem Fehler überhaupt fAnyOperationsAborted "gültig"?
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 7. Jan 2021 um 21:41 Uhr)
  Mit Zitat antworten Zitat
mmw
(Gast)

n/a Beiträge
 
#6

AW: Dateien mit Pfad kopieren

  Alt 8. Jan 2021, 17:25
hallo,

laut Online -Hilfe (MS)

Note This string must be double-null terminated.

das gilt für quelle und ziel

das scheint bei pa nicht der Fall zu sein.

ich habs mal so umgesetzt. (auszug)

Delphi-Quellcode:
     source_file:= src_file+#0#0;
     destination_file:= dest_file+#0#0;

     with SHFOS do begin
       Wnd:=0;
       pFrom:=PChar(source_file);
       pTo:=PChar(destination_file);
vielleicht hilft's
gruß
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.553 Beiträge
 
Delphi 12 Athens
 
#7

AW: Dateien mit Pfad kopieren

  Alt 8. Jan 2021, 17:59
laut Online -Hilfe (MS)

Note This string must be double-null terminated.
Das ist kein Problem.

Delphi-Strings haben bereits eine integrierte Doppel-0 am Ende, nach dem letzten Char, welche beim Cast in den PChar ebenfalls drin bleiben.
Ausnahme ist der ShortString. (der hat ausschließlich ein Längenbyte davor und keine #0 dahinter)
Beim WideString weiß ich es grade nicht, aber vermutlich auch. (genaueres siehe BSTR von Microsoft ... #0 ist drin, aber bei #0#0 bin ich nicht sicher)


Man kann also selbst die Null(en) anhängen, oder kann es beruhigt weglassen und die impliziten #0#0 verwenden.


Die Beiden sind "String-Listen", also #0 zwischen den einzelnen Einträgen und #0#0 (also ein Leerstring #0''#0 ) als Ende.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 9. Jan 2021 um 00:08 Uhr)
  Mit Zitat antworten Zitat
mmw
(Gast)

n/a Beiträge
 
#8

AW: Dateien mit Pfad kopieren

  Alt 8. Jan 2021, 18:28
Hallo,
stimmt. wäre jetzt auch nur wegen dem s:=s + #0;

Bei mir funktioniert's mit SHFileOperation mit oder ohne.

Gruß
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.553 Beiträge
 
Delphi 12 Athens
 
#9

AW: Dateien mit Pfad kopieren

  Alt 9. Jan 2021, 00:17
Hast du dir mal überlegt genausoviele Einträge ins TO einzufügen, wie ins FROM?
In der Hilfe steht nichts davon, dass "ein" Ziel für mehrere/alle Quellen gilt. (auch wenn es zu praktisch wäre, wenn es so sein sollte)

Wenn du nicht alle Felder im Record zuweist, dann solltest du den Record am Anfang unbedingt mit Nullen initialisieren.
FillChar bzw. FillMemory
Auch wenn man alles zuweist, so sollte/könnte man es dennoch immer machen ... einmal kann man es so nie vergessen, wenn man es immer macht und auch eventuelle FillBytes (allignment) werden mit geleert.


Warum eigentlich Copy(s, LastDelimiter('\', s)+1, MAXINT) anstatt einem einfachem ExtractFileName?
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Reinhold
(Gast)

n/a Beiträge
 
#10

AW: Dateien mit Pfad kopieren

  Alt 9. Jan 2021, 08:59
Hallo,

wenn ich, Dich richtig verstanden habe hast du eine Verzeichnisstruktur der folgenden Art hast:
C:\Bilder\Delphi\Programmme
in der sich mehere Dateien befinden und in
F:\Bilder\Delphi\Programme
speichern möchtest.

Um dies zu machen mußt Du als erstes dir die Verzeichniststruktur vom Zielsystem zusammen bauen und danach kopieren.
Das ich wie folgt machen würde.

Delphi-Quellcode:
//zB:
// Source = 'C:\Bilder\Delphi\Programmme';
//Dest = 'G:/';

// nur Path ohne Dateinamen
procedure CopyPath(const SourcePath, DestPath: string);
var
  Dest: string;
  Dir: TDirectory;
begin
  Dest:= ExcludeTrailingPathDelimiter(DestPath);
  Dest:= StringReplace(Source,ExtractFileDrive(Source),Dest,[]);
  Dir.Copy(Source,Path);
end;
  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 23:14 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