![]() |
Kopieren von Ordner und Dateien mit Rückmeldung
Hallo,
mit folgendem Code kopier ich Dateien:
Delphi-Quellcode:
Nun möcht ich aber gerne mit diesem Code auch Ordner kopieren.
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; { ... } 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? |
Re: Kopieren von Ordner und Dateien mit Rückmeldung
Ich mach´s kurz:
![]() |
Re: Kopieren von Ordner und Dateien mit Rückmeldung
Zitat:
Ich will das ganze ohne WinApi. Also so wie mein Code - nur eben auch für Ordner. |
Re: Kopieren von Ordner und Dateien mit Rückmeldung
Hallo Helmi,
Zitat:
Delphi-Quellcode:
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...
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; Grüße vom marabu |
Re: Kopieren von Ordner und Dateien mit Rückmeldung
Zitat:
Entweder du benutzt ![]() ![]() |
Re: Kopieren von Ordner und Dateien mit Rückmeldung
Zitat:
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. |
Re: Kopieren von Ordner und Dateien mit Rückmeldung
Zitat:
Den Code habe ich geändert, erhalte jetzt aber immer an der Stelle
Delphi-Quellcode:
die Exception EReadError Meldung "Stream-Lesefehler" :gruebel:
FileProgressBar.Position := FileProgressBar.Position + fsTarget.CopyFrom(fsSource, chunkSize);
Was muss ich anders machen? |
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:
marabu
...
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; ... |
Re: Kopieren von Ordner und Dateien mit Rückmeldung
:-D Yupp, so funktionierts! Vielen Dank.
|
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 23:40 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