AGB  ·  Datenschutz  ·  Impressum  







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

Problem beim Verzeichniskopieren

Ein Thema von MarcusB · begonnen am 10. Mai 2006 · letzter Beitrag vom 16. Mai 2006
Antwort Antwort
MarcusB

Registriert seit: 7. Mär 2004
121 Beiträge
 
Delphi 7 Professional
 
#1

Problem beim Verzeichniskopieren

  Alt 10. Mai 2006, 14:17
Hallo,

ich habe mal wieder ein Problem

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?

Vielen Dank schonmal
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#2

Re: Problem beim Verzeichniskopieren

  Alt 10. Mai 2006, 18:40
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Problem beim Verzeichniskopieren

  Alt 10. Mai 2006, 18:40
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
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

[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)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
MarcusB

Registriert seit: 7. Mär 2004
121 Beiträge
 
Delphi 7 Professional
 
#4

Re: Problem beim Verzeichniskopieren

  Alt 11. Mai 2006, 07:17
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 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
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#5

Re: Problem beim Verzeichniskopieren

  Alt 11. Mai 2006, 07:55
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
  Mit Zitat antworten Zitat
MarcusB

Registriert seit: 7. Mär 2004
121 Beiträge
 
Delphi 7 Professional
 
#6

Re: Problem beim Verzeichniskopieren

  Alt 12. Mai 2006, 07:45
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).
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Problem beim Verzeichniskopieren

  Alt 12. Mai 2006, 10:37
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
MarcusB

Registriert seit: 7. Mär 2004
121 Beiträge
 
Delphi 7 Professional
 
#8

Re: Problem beim Verzeichniskopieren

  Alt 16. Mai 2006, 17:18
Hallo himitsu,

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

  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 13:16 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