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..4096of 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 user profile iconNarses: 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?