Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Kopieren von Ordner und Dateien mit Rückmeldung (https://www.delphipraxis.net/49889-kopieren-von-ordner-und-dateien-mit-rueckmeldung.html)

Helmi 17. Jul 2005 20:05


Kopieren von Ordner und Dateien mit Rückmeldung
 
Hallo,

mit folgendem Code kopier ich Dateien:

Delphi-Quellcode:
var
  QuellDatei, ZielDatei: String;

  FileLength: LongInt;
  FromF, ToF: file of byte;
  Buffer: array[0..51200] of char;
  NumRead, PB_Position: integer;
  S: String;

begin
{ ... }
  AssignFile(FromF, QuellDatei);
  FileMode  := fmOpenread;
  reset(FromF);
  AssignFile(ToF, ZielDatei);
  rewrite(ToF);
  FileLength := FileSize(FromF);

  try
    //Variablen vordefinieren (Progressbar)
    PB_Min     := 0;
    PB_Max     := FileLength;
    PB_Position := 0;

    while FileLength > 0 do
      begin
        BlockRead(FromF, Buffer[0], SizeOf(Buffer), NumRead);
        FileLength := FileLength - NumRead;

        BlockWrite(ToF, Buffer[0], NumRead);

        //ProgressBar
        PB_Position := PB_Position + NumRead;
      end;
  finally
    CloseFile(FromF);
    CloseFile(ToF);
  end;
{ ... }
Nun möcht ich aber gerne mit diesem Code auch Ordner kopieren.
Da ich den "Kopierzustand" in einer ProgressBar anzeige, müsste also auch das möglich sein.

Kann man den Code oben etwas verändern, damit Dateien und Ordner zum Kopieren sind?

MathiasSimmack 17. Jul 2005 20:24

Re: Kopieren von Ordner und Dateien mit Rückmeldung
 
Ich mach´s kurz: Hier im Forum suchenSHFileOperation bietet alles, was man braucht. :stupid:

Helmi 17. Jul 2005 20:30

Re: Kopieren von Ordner und Dateien mit Rückmeldung
 
Zitat:

Zitat von MathiasSimmack
Ich mach´s kurz: Hier im Forum suchenSHFileOperation bietet alles, was man braucht. :stupid:

Gerade das will ich ja nicht. Bei "SHFileOperation" wird ja ein neues Fenster geöffnet und sollte z. B. schon die ZielDatei vorhanden sein, kommt das Windows-Fenster ob man es wirklich überschreiben will.

Ich will das ganze ohne WinApi. Also so wie mein Code - nur eben auch für Ordner.

marabu 17. Jul 2005 21:29

Re: Kopieren von Ordner und Dateien mit Rückmeldung
 
Hallo Helmi,

Zitat:

Zitat von Helmi
Kann man den Code oben etwas verändern, damit Dateien und Ordner zum Kopieren sind?

Nein, ich denke das würde wenig Sinn machen. Aber vielleicht möchtest du deinen Code trotzdem ändern?

Delphi-Quellcode:
type
  TYourForm = class(TForm)
    ...
  private
    Canceled: boolean;
    ChunkSize: cardinal;
    procedure FileCopy(const sourceName, targetName: string; var canceled: boolean);
    procedure FilesCopy(const sourceFolder, targetFolder: string; var canceled: boolean);  
  end;

procedure TDemoForm.FileCopy(const sourceName, TargetName: string);
var
  fsSource, fsTarget: TFileStream;
begin
  fsSource := TFileStream.Create(sourceName, fmOpenRead, fmShareDenyWrite);
  fsTarget := TFileStream.Create(targetName, fmCreate, fmShareDenyWrite);
  FileProgressBar.Max := fsSource.Size;
  Canceled := false;
  repeat
    FileProgressBar.Position := FileProgressBar.Position + fsTarget.CopyFrom(fsSource, chunkSize);
    Application.ProcessMessages;
  until Canceled or (FileProgressBar.Position = FileProgressBar.Max);
end;

procedure TDemoForm.FilesCopy(sourceFolder, targetFolder: string);
var
  sr: TSearchRec;
  fileSpec, sourceName, targetName: string;
  attr: integer;
begin
  attr := faArchive + faDirectory;
  sourceFolder := IncludeTrailingPathDelimiter(sourceFolder);
  targetFolder := IncludeTrailingPathDelimiter(targetFolder);
  if not DirectoryExists(targetFolder) then
    ForceDirectories(targetFolder);
  fileSpec := sourceFolder + '*.*';
  if FindFirst(fileSpec, attr, sr) = 0 then
  repeat
    if sr.Attr and faDirectory = 0
      then FileCopy(sourceFolder + sr.Name, targetFolder + sr.Name)
      else FilesCopy(sourceFolder + sr.Name, targetFolder + sr.Name);
  until Canceled or (FindNext(sr) <> 0);
  FindClose(sr);
end;
Der Code ist syntaktisch in Ordnung, aber getestet habe ich ihn nicht. Ist auch mehr als Denkanstoss gedacht. Für einen FilesProgressBar wirst du dir noch Gedanken machen müssen...

Grüße vom marabu

Luckie 17. Jul 2005 22:50

Re: Kopieren von Ordner und Dateien mit Rückmeldung
 
Zitat:

Zitat von Helmi
Ich will das ganze ohne WinApi.

Das wird schwer werden. Die WinAPI ist die einzigest Schnittstelle, die dir Windows bietet um mit Windows zu kommunizieren. :roll:
Entweder du benutzt CopyFileEx oder guckst dir mal den StreamProgressAdapter an.

bigg 18. Jul 2005 00:47

Re: Kopieren von Ordner und Dateien mit Rückmeldung
 
Zitat:

Kann man den Code oben etwas verändern, damit Dateien und Ordner zum Kopieren sind?
Ja, das ist natürlich möglich.

Einen Ordner erstellt man mit MKDir(Path: String).
Eine Datei kannst du über die Klasse "TFileStream" einlesen und über eine zweite Klasse irgendwo hinschreiben lassen.

meierotto 26. Jul 2005 09:23

Re: Kopieren von Ordner und Dateien mit Rückmeldung
 
Zitat:

Zitat von marabu
... Aber vielleicht möchtest du deinen Code trotzdem ändern?

Ich wärme das Thema nochmal auf :coder2:
Den Code habe ich geändert, erhalte jetzt aber immer an der Stelle
Delphi-Quellcode:
FileProgressBar.Position := FileProgressBar.Position + fsTarget.CopyFrom(fsSource, chunkSize);
die Exception EReadError Meldung "Stream-Lesefehler" :gruebel:

Was muss ich anders machen?

marabu 26. Jul 2005 10:18

Re: Kopieren von Ordner und Dateien mit Rückmeldung
 
Der stream-read-error resultiert aus einem unterschiedlichen Verhalten der Methoden CopyFrom() und Read(). Während Read() kein Problem damit hat, dass mehr Bytes angefordert werden als noch vorhanden sind, wirft CopyFrom() eine Exception, wenn man nicht byte-genau liest.

Diese Änderung sollte das Problem beheben:

Delphi-Quellcode:
...
FileProgressBar.Position := 0; // fehlte in meinem ersten Beitrag
remainingBytes := fsSource.Size;
repeat
  bytes := fsTarget.CopyFrom(fsSource, Min(chunkSize, remainingBytes));
  Dec(remainingBytes, bytes);
  FileProgressBar.Position := FileProgressBar.Position + bytes;
  Application.ProcessMessages;
until remainingBytes = 0;
...
marabu

meierotto 26. Jul 2005 10:47

Re: Kopieren von Ordner und Dateien mit Rückmeldung
 
:-D Yupp, so funktionierts! Vielen Dank.

JWeis 23. Aug 2005 10:17

Re: Kopieren von Ordner und Dateien mit Rückmeldung
 
hey meierotto

kannst du mir mal deinen Quellcode posten denn ich hab auch das problem, das ich keine progressbar einbauen kann
hab garkeinen plan :coder2:
vielen dank im vorraus


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