Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Fehlerhaftes kopieren (https://www.delphipraxis.net/117138-fehlerhaftes-kopieren.html)

delphinia 12. Jul 2008 04:28


Fehlerhaftes kopieren
 
Erstmal meine Auflistungsfunktion von Dateien/Ordnern: (funktioniert wunderbar)

Delphi-Quellcode:
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;
Das Problem ist nun nur.
Kopiere ich nun die Files aus der FileList

Delphi-Quellcode:
CopyFile(PChar(FileList[i]), PChar('F:\test\' + ExtractFileName(FileList[i])), true);
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?

Namenloser 12. Jul 2008 04:34

Re: Fehlerhaftes kopieren
 
Na, ist doch klar:
Delphi-Quellcode:
CopyFile(PChar(FileList[i]), PChar('F:\test\' + ExtractFileName(FileList[i])), true);
Du rufst ja auch ExtractFileName auf, damit wird der Dateipfad auf den Namen der Datei reduziert.

delphinia 12. Jul 2008 04:50

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

Namenloser 12. Jul 2008 05:03

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]+'\';
}

marabu 12. Jul 2008 08:46

Re: Fehlerhaftes kopieren
 
Moin Doreen,

Zitat:

Zitat von delphinia
... Das Problem ist nun nur. Kopiere ich nun die Files aus der FileList

Delphi-Quellcode:
CopyFile(PChar(FileList[i]), PChar('F:\test\' + ExtractFileName(FileList[i])), true);
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? ...

das könnte helfen:

Delphi-Quellcode:
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;
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.

Freundliche Grüße

Namenloser 12. Jul 2008 10:45

Re: Fehlerhaftes kopieren
 
Zitat:

ExtractRelativePath(ExtractFileDrive(fn), ExtractFilePath(fn))
Wtf? Sowas gibts schon? :shock:
Delphi erstaunt mich mal wieder :stupid:

delphinia 12. Jul 2008 11:44

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?

marabu 12. Jul 2008 12:02

Re: Fehlerhaftes kopieren
 
Das kannst du so machen - oder du arbeitest mit einer Funktion, wie ExtractParentDir().

delphinia 12. Jul 2008 12:08

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

marabu 12. Jul 2008 12:23

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:
begin
  dir := 'C:\Windows\System32\delphinia';
  GetFilesInDirectory(dir, ...);
  relPath := ExtractRelativePath(ExtractFilePath(dir), FileList[i]);
end;
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:54 Uhr.
Seite 1 von 2  1 2      

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