![]() |
Fehlerhaftes kopieren
Erstmal meine Auflistungsfunktion von Dateien/Ordnern: (funktioniert wunderbar)
Delphi-Quellcode:
Das Problem ist nun nur.
procedure GetFilesInDirectory(Directory: string; const Mask: string; List: TStrings; WithSubDirs, ClearList: Boolean; var ATotalSize: Int64);
procedure ScanDir(const Directory: string); var SR: TSearchRec; begin if FindFirst(Directory + Mask, faAnyFile and not faDirectory, SR) = 0 then try repeat List.Add(Directory + SR.Name) until FindNext(SR) <> 0; finally FindClose(SR); end; if WithSubDirs then begin if FindFirst(Directory + '*.*', faAnyFile, SR) = 0 then try repeat if ((SR.attr and faDirectory) = faDirectory) and (SR.Name <> '.') and (SR.Name <> '..') then ScanDir(Directory + SR.Name + '\'); Inc(ATotalSize, SR.Size); until FindNext(SR) <> 0; finally FindClose(SR); end; end; end; begin List.BeginUpdate; try if ClearList then List.Clear; if Directory = '' then Exit; if Directory[Length(Directory)] <> '\' then Directory := Directory + '\'; ScanDir(Directory); finally List.EndUpdate; end; end; Kopiere ich nun die Files aus der FileList
Delphi-Quellcode:
kopiert auch alle Dateien NUR leider alle in ein Verzeichnis statt so wie diese asu ihren eigenen Ordnern kommen diese auch da wieder hinzupacken... WO ist da der Fehler was fehlt mir?
CopyFile(PChar(FileList[i]), PChar('F:\test\' + ExtractFileName(FileList[i])), true);
|
Re: Fehlerhaftes kopieren
Na, ist doch klar:
Delphi-Quellcode:
Du rufst ja auch ExtractFileName auf, damit wird der Dateipfad auf den Namen der Datei reduziert.
CopyFile(PChar(FileList[i]), PChar('F:\test\' + ExtractFileName(FileList[i])), true);
|
Re: Fehlerhaftes kopieren
hm ok das verstehe ich aber nun habe ich wenn ich mir den Pfad per ShowMessage ausgeben lasse
Sowas stehen F:\test\D:\test\ Habe dann da ja in der FileList der ganze Pfad + eventueller File steht (auch das Laufwerksangaben) die stören und verhindern den kopiervorgang bzw das anlegen von Verzeichnissen |
Re: Fehlerhaftes kopieren
Du müsstest die Pfadangaben aufsplitten (siehe Explode-Funktion aus der Codelib) und dann nur die Verzeichnisebenen wieder zusammenfügen die hinter dem Hauptverzeichnis liegen.
Pseudocode:
Code:
function RelativerPfad(Hauptpfad, Unterverzeichnis: string): string;
{ hauptpfad_verzeichnistiefe = array_count(split(hauptpfad,'\')); unterverzeichnis_parts = split(hauptpfad,'\'); for i := hauptpfad_verzeichnistiefe to array_count(unterverzeichnis_parts) do result = result+unterverzeichnis_parts[i]+'\'; } |
Re: Fehlerhaftes kopieren
Moin Doreen,
Zitat:
Delphi-Quellcode:
Nachtrag: Es reicht beim Kopieren eigentlich der minimale relative Pfad. Dazu kannst du einfach ExtractRelativPath(Directory, FileList[i]) aufrufen, wobei Directory das gleiche Verzeichnis sein sollte, welches du an deine Prozedur GetFilesInDirectory() übergeben hast. Idealerweise erweiterst du deine Prozedur um einen Parameter, der die Rückgabe von absoluten oder relativen Dateinamen steuert.
function RelativePath(const fn: TFileName): TFileName;
begin Result := ExtractRelativePath(ExtractFileDrive(fn), ExtractFilePath(fn)); end; begin CopyFile(PChar(FileList[i]), PChar('F:\test\' + RelativePath(FileList[i])), True); end; Freundliche Grüße |
Re: Fehlerhaftes kopieren
Zitat:
Delphi erstaunt mich mal wieder :stupid: |
Re: Fehlerhaftes kopieren
Ok danke Euch den Fehler von mir bzw was ich machen muss habe ich verstanden.
Aber eines habe ich NOCH :-) Und zwar beispiel der Pfad C:\Windows\System32\mein_ordner Diesen möchte ich kopieren mitsamt allen Unterordnern / Dateien ABER NUR diesen bei meinem / Euren Beispielen oben wäre es ja dann so beim Target Pfad D:\COPY\Windows\System32\mein_ordner Ich würde es gerne so haben das ALLES ausser mein_ordner wegfällt So D:\COPY\mein_ordner Würde es da reichen wenn ich sowas wie einfach String im Target String nach "C:\Windows\System32\" suche und es lösche? |
Re: Fehlerhaftes kopieren
Das kannst du so machen - oder du arbeitest mit einer Funktion, wie
![]() |
Re: Fehlerhaftes kopieren
Also wenn ich es so machen tät wäre das nichts schlimmes oder was schlechtes?!
Deine Funktion hat den Nachteil, dass unterPfade auch nur als deren Ordner nagzeigt werden Also beispiel C:\Windows\Mein Order C:\Windows\Mein Order\Test daraus wird dann Mein Ordner Test Statt Mein Ordner Mein Ordner\test |
Re: Fehlerhaftes kopieren
Entschuldige, ich habe dir die falsche Funktion verlinkt. Eigentlich geht es ja darum, dass du den ParentPath vom Directory benötigst, mit dem du deine Prozedur GetFilesInDirectory() aufgerufen hast:
Delphi-Quellcode:
Ob du es mit einer Funktion oder zu Fuß umsetzt, ist für das Ergebnis egal. Wenn du den Präfix mit Delete() wegschneidest, dann ist das für dich sicher akzeptabel. Die Funktion hat erst dann einen Wert für dich, wenn du deine Programmierung auf Wiederverwendung ausrichtest.
begin
dir := 'C:\Windows\System32\delphinia'; GetFilesInDirectory(dir, ...); relPath := ExtractRelativePath(ExtractFilePath(dir), FileList[i]); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:54 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