Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem beim Verzeichniskopieren (https://www.delphipraxis.net/69119-problem-beim-verzeichniskopieren.html)

MarcusB 10. Mai 2006 14:17


Problem beim Verzeichniskopieren
 
Hallo,

ich habe mal wieder ein Problem :drunken:

Ich möchte mit einem kleinen Programm ein paar Verzeichnisse von meiner lokalen Festplatte auf eine USB-Festplatte kopieren.

Dazu verwende ich folgenden Code (vereinfacht, für bessere Übersicht):

Delphi-Quellcode:
function CopyDir(const fromDir, toDir: string): Boolean;
var
  fos: TSHFileOpStruct;
begin
  ZeroMemory(@fos, SizeOf(fos));
  with fos do
  begin
    wFunc := FO_COPY;
    fFlags := FOF_FILESONLY;
    pFrom := PChar(fromDir + #0);
    pTo   := PChar(toDir)
  end;
  Result := (0 = ShFileOperation(fos));
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  BackupPfad: String;
  bl: TStringList;
  i: Integer;
begin
  bl := TStringList.Create;

  //Das folgende wird normalerweise aus einer Datei ausgelesen
  bl.Add('C:\Daten\Verzeichnis_1');
  bl.Add('C:\Daten\Verzeichnis_2');
  bl.Add('C:\Daten\Verzeichnis_3');
  bl.Add('C:\Daten\Verzeichnis_4');

  BackupPfad := 'T:\Backup\'; //T: ist die USB-Festplatte

  for i := 0 to bl.Count - 1 do
  begin
    CopyDir(bl[i], BackupPfad);
  end;
end;
So, nun das Problem:

Er kopiert eigentlich alles richtig, bis auf den letzten Ordner, denn hier schmeisst er die Dateien die in diesem Ordner liegen einfach in das T:\Backup Verzeichnis, d.h. es sieht dann etwa so aus:

Delphi-Quellcode:
T:\Backup\Verzeichnis_1\
T:\Backup\Verzeichnis_2\
T:\Backup\Verzeichnis_3\
T:\Backup\datei1.xls      //ist normalerweise im Verzeichnis_4
T:\Backup\datei2.xls      //ist normalerweise im Verzeichnis_4
T:\Backup\UnterorderXY\    //ist normalerweise im Verzeichnis_4
T:\Backup\readme.txt      //ist normalerweise im Verzeichnis_4
Wer kann mir sagen, wo ich da den Fehler gemacht habe? :gruebel:

Vielen Dank schonmal :-D

Hawkeye219 10. Mai 2006 18:40

Re: Problem beim Verzeichniskopieren
 
Hallo,

möglicherweise ist die Terminierung der einzelnen Strings (pFrom/pTo) nicht ganz korrekt.
Sakura stellt hier einige Routinen vor, die für dich interessant sein könnten.

Gruß Hawkeye

himitsu 10. Mai 2006 18:40

Re: Problem beim Verzeichniskopieren
 
Wenn du den Code ganz genauso wie oben hast, dann liegt es schonmal nicht an diesem, da ja die ersten Verzeichnisse richtig kopiert werden.

Also entweder machst du es in deinem Programm anders, oder die Datei (mit den Verzeichnissen) ist futsch.

Lösung:
1: Datei überprüfen
2: oder uns den "richtigen" Code geben, falls da der Fehler drin ist :zwinker:
3: ...

Kannst ja auch erstmal versuchen noch ein 5. Verzeichniss an die Liste anzuhängen ... mal sehn was dann passiert ^^

[add]
Die Terminierung sieht eigenlich OK aus :gruebel:

[add2]
in der CodeLib gibt's (glaub ich) ein CopyDir (oder wie es da heißt) für mehrere Verzeichnisse, oder halt selbergemacht,
dann wird alles in einem Zug kopiert und wenn du dir dann eventuell noch den Fortschritsdialog anzeigen läßt, dann ist dieser ja auch für alles zusammen :)
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  BackupPfad: String;
  bl: TStringList;
  i: Integer;
  s: String;
  fos: TSHFileOpStruct;
begin
  bl := TStringList.Create;

  //Das folgende wird normalerweise aus einer Datei ausgelesen
  bl.Add('C:\Daten\Verzeichnis_1');
  bl.Add('C:\Daten\Verzeichnis_2');
  bl.Add('C:\Daten\Verzeichnis_3');
  bl.Add('C:\Daten\Verzeichnis_4');

  BackupPfad := 'T:\Backup\';


  if bl.Count > 0 then
  begin
    s := '';
    for i := 0 to bl.Count - 1 do
      s := s + bl[i] + #0;
    ZeroMemory(@fos, SizeOf(fos));
    with fos do
    begin
      wFunc := FO_COPY;
      fFlags := FOF_FILESONLY;
      pFrom := PChar(s + #0);
      pTo   := PChar(BackupPfad + #0)
    end;
    ShFileOperation(fos);
  end;

  bl.Free;
end;
PS: die StringList gibst du doch hoffentlich auch wieder frei? (in deinem richtigen Code)

MarcusB 11. Mai 2006 07:17

Re: Problem beim Verzeichniskopieren
 
Hallo,

danke für Eure Hinweise.
Ich habe aus dem Code nur die Dinge gelöscht, die mit der eigentlichen Kopiererei nichts zu tun haben.

Allerdings habe ich nun herausgefunden, dass es nicht der letzte Ordner ist der falsch kopiert wird, sondern der erste!

Ich habe zum Testen noch ein weiteres Verzeichnis erstellt (C:\Daten\AAAA - damit es ganz vorne ist) und siehe da, er "zerhaut" immer den ersten.

Zitat:

Zitat von himitsu
in der CodeLib gibt's (glaub ich) ein CopyDir (oder wie es da heißt) für mehrere Verzeichnisse, oder halt selbergemacht, dann wird alles in einem Zug kopiert und wenn du dir dann eventuell noch den Fortschritsdialog anzeigen läßt, dann ist dieser ja auch für alles zusammen

Das werde ich mir auf jeden Fall mal anschauen, das mit der Gesamtzeit wäre nämlich ganz praktisch.

Aber das eigentliche Problem ist schon etwas strange :gruebel:

Hawkeye219 11. Mai 2006 07:55

Re: Problem beim Verzeichniskopieren
 
Hallo,

ich habe vielleicht eine Erklärung für das Phänomen: der Fehler tritt offenbar nur dann auf, wenn das Zielverzeichnis beim Start des Kopiervorgangs noch nicht existiert.

Gruß Hawkeye

MarcusB 12. Mai 2006 07:45

Re: Problem beim Verzeichniskopieren
 
Hm, dann wärs ja evetuell ein Fehler in der CopyDir Funktion?

Aber ich denke, diese Funktion wird ja von vielen benutzt, komisch dass sonst niemand dieses Problem hat(te).

himitsu 12. Mai 2006 10:37

Re: Problem beim Verzeichniskopieren
 
Hmmm, also bei mir hab ich da noch keinen Fehler entdeckt, wenn das Verzeichnis noch nicht existierte, aber wenn da wirklich der Fehler liegt, dann kann man es wohl auch nicht beheben, es sei den man nimmt ShFileOperation nicht mehr und kopiert selber (Datei für Datei).

Aber du kannst es ja mal mit ForceDirectories versuchen, also vorher einfach das Verzeichnis erstellen. :)

Code:
if bl.Count > 0 then
begin
  [color=#ff0000][b]ForceDirectories(BackupPfad);[/b][/color]
  s := '';
  for i := 0 to bl.Count - 1 do
    s := s + bl[ i] + #0;
  ZeroMemory(@fos, SizeOf(fos));
  with fos do
  begin
    wFunc := FO_COPY;
    fFlags := FOF_FILESONLY;
    pFrom := PChar(s + #0);
    pTo   := PChar(BackupPfad + #0)
  end;
  ShFileOperation(fos);
end;
[add]
ich merk gerad, FOF_FILEONLY ... hast du es auch schon mal ohne dem versucht?


und eventuell wäre auch noch FOF_NOCONFIRMATION & FOF_NOCONFIRMMKDIR was für dich ^^
also fFlags := FOF_FILESONLY or FOF_NOCONFIRMATION or FOF_NOCONFIRMMKDIR; + vorheriges ForceDirectories,
oder fFlags := FOF_NOCONFIRMATION or FOF_NOCONFIRMMKDIR; ohne ForceDirectories :gruebel:

MarcusB 16. Mai 2006 17:18

Re: Problem beim Verzeichniskopieren
 
Hallo himitsu,

Deine letzte Antwort hatte ich leider übersehen :oops:
Aber danke nochmal für Deine Hinweise, ich werde das nochmal checken und das Ergebnis hier posten.

:hi:


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:03 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