![]() |
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:
So, nun das Problem:
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; 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:
Wer kann mir sagen, wo ich da den Fehler gemacht habe? :gruebel:
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 Vielen Dank schonmal :-D |
Re: Problem beim Verzeichniskopieren
|
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:
PS: die StringList gibst du doch hoffentlich auch wieder frei? (in deinem richtigen Code)
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; |
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:
Aber das eigentliche Problem ist schon etwas strange :gruebel: |
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 |
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). |
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:
[add]
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; 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: |
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 17:04 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