Entwickler-Ecke
Dateizugriff - Eine Reihe von Dateien mit Fortschrittsbalken kopieren
LonghornUser - Fr 10.02.06 21:23
Titel: Eine Reihe von Dateien mit Fortschrittsbalken kopieren
Hallo,
ich möchte, wie der Titel schon sagt, eine Reihe von Dateien mit Fortschrittsbalken kopieren.
Ich habe 20 Dateien, die in verschiedene Verzeichnisse kopiert werden sollen. Jetzt möchte ich, dass ein Fortschrittsbalken den Gesamtprozess anzeigt. Wie ich das für eine Datei mache, weiß ich bereits (habe einen Tipp bei (glaube) Swissdelphicenter gefunden). Aber wie mache ich es, dass Eine Progressbar den Fortschritt ALLER Dateien anzeigt ? Geht das ? Ich meine, wie in einer normalen Installation.
Danke schonmal.
Ciao LonghornUser
Danniolo - Fr 10.02.06 21:29
Indem du einfach den Progress aller zusammenziehst und dann in dem Fortschrittsbalken anzeigts.
BenBE - Sa 11.02.06 00:43
@Danniolo: Solch eine Antwort bringt keinem was. Er wollte es per Shell wissen (soweit ich das bei ihm entnehme) und nicht, wie man's in Delphi löst.
@LHUser: In den ShellOperation-Strukturen werden die Dateinamen der zu bearbeitenden Dateien nullterminiert spezifiziert. Diese API-Funktion ist grundsätzlich dazu gedacht, um mit Listen von Dateien zu arbeiten, weshalb man die Liste mit einem zusätzlichen zweiten
#0 abschließen muss.
Dazu kannst Du als Grundlage den Source von
DSDT [
http://www.dsdt.info/tipps/?id=215] nutzen und musst dabei für
ASource und
ADest einfach deine jeweils paarweisen Zuordnungen von Quell- und Zieldateinamen angeben:
Delphi-Quelltext
1:
| CopyFileEx('A.txt'#0'B.txt'#0'C.txt', 'A.txt.bak'#0'B.txt.bak'#0'C.txt.bak', true); |
Innerhalb des Beispielsources muss lediglich das Flag
FOF_SILENT entfernt werden.
HTH.
LonghornUser - Mo 13.02.06 16:05
Alles klar. Jetzt gehts :) Danke !
LonghornUser - Fr 03.03.06 23:04
Mhm, habe jetzt doch gemerkt. Also die Dateiliste hab ich, aber die Progressbar. Wo wird die denn eingebunden ??
LonghornUser - Fr 03.03.06 23:12
Oder könnte man die Prozedur
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27:
| Procedure TForm1.CopyFileWithProgressBar(Source, Destination : string); var FromF, ToF : file of byte; Buffer : array[0..4096] of char; NumRead : integer; FileLength : longint; begin AssignFile(FromF,Source); reset(FromF); AssignFile(ToF,Destination); rewrite(ToF); FileLength:=FileSize(FromF); With Progressbar1 do begin Min := 0; Max := FileLength; while FileLength > 0 do begin BlockRead(FromF,Buffer[0],SizeOf(Buffer),NumRead); FileLength := FileLength - NumRead; BlockWrite(ToF,Buffer[0],NumRead); Position := Position + NumRead; end; CloseFile(FromF); CloseFile(ToF); end; end; |
eventuell so umschreiben, dass für die "Quelldateien" eine Listbox.Items als parameter übergeben wird und als "ZielDatei" ein Verzeichnis ?
Also so:
Quelltext
1:
| Procedure TForm1.CopyFileWithProgressBar(SourceFiles:TStrings, DestinationFolder : string); |
fuba - Mo 24.04.06 19:36
ich habs so gemacht:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37:
| function PProgressRoutine(TotalFileSize, TotalBytesTransferred, StreamSize, StreamBytesTransferred: LARGE_INTEGER; dwStreamNumber, dwCallbackReason: DWORD; hSourceFile, hDestinationFile: THandle; lpData: Pointer): DWORD; stdcall; begin if dwCallbackReason = CALLBACK_STREAM_SWITCH then TProgressBar(lpData).max := TotalFileSize.QuadPart;
TProgressBar(lpData).Position := TotalBytesTransferred.QuadPart; Application.ProcessMessages; Result := PROGRESS_CONTINUE; end;
procedure ListCopyProgress(const Files: TStrings; const aDestDir: string; TotalProgressBar, CurrentProgressBar: TProgressBar); var x, y : integer; S: string; begin FCancelled := False; x:=Files.Count; TotalProgressBar.Min:=0; TotalProgressBar.Max:=x; S:=ExcludeTrailingPathDelimiter(aDestDir) + '\'; for y:=0 to x-1 do begin CopyFileEx(PChar(Files[y]), PChar(S + ExtractFileName(Files[y])), @PProgressRoutine, CurrentProgressBar, @FCancelled, 0); TotalProgressBar.Position:=y+1; end; end; |
Moderiert von
Narses: Komplett-Zitat des letzen Beitrags entfernt
whitef - Mi 15.10.08 18:22
nettes programm, gibts da auch ne verison in der man ein ordner in die listbox droppen oder öffnen kann, so das der komplette inhalt (+unterordner) verarbeitet wird?
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!