![]() |
Größe einer "unfertigen" Datei...?
Moin Leutz !
Hab ma ne schwierige frage (denk ich zumindest *g) für euch: Wie kann ich die größe einer Datei bestimmen welche gerade noch erstellt/kopiert wird ? (Oder ihr verratet mir wie ich den Fortschritt von SHFileOp sonst abfragen kann...ohne den Standart-Dialog ! :) ) thx, Adversus |
Re: Größe einer "unfertigen" Datei...?
Habe nach
![]() ![]() leider scheint es mit dieser Funktion nicht zu klappen. Allerdings kannst du dir ja deine eigene Kopierfunktion basteln. Denke mal, dass man über ![]() |
Re: Größe einer "unfertigen" Datei...?
...danke, aber das hab ich ja versucht...mit genau dieser funktion klappt das zwar für meinen lokalen pc...aber wenn ich was übers netzwerk kopiere klappt der fortschritt nicht...laut progressbar ist er schon fertig...kopiert dann aber noch 5minuten bis er wirklich fertig is (bei großen dateien)
Hab das verwendet:
Delphi-Quellcode:
Vielleicht kann mir ja einer sagen wie man das hinbekommt das der progress auch im LAN stimmt ????
function CopyExThread(p: PCopyEx): Integer;
var Source: String; Dest: String; Handle: THandle; Cancel: PBool; FromF, ToF : file of byte; Buffer : array[0..4096] of char; NumRead : integer; FileLength : longint; begin Source := p.Source; Dest := p.Dest; Handle := p.Handle; Cancel := PBOOL(False); AssignFile(FromF,Source); reset(FromF); AssignFile(ToF,Dest); rewrite(ToF); FileLength:=FileSize(FromF); With form1.copyProgressbar1 do begin Min := 0; Max := FileLength; while FileLength > 0 do begin BlockRead(FromF,Buffer[0],SizeOf(Buffer),NumRead); FileLength := FileLength - NumRead; while pausecopy=true do begin Application.ProcessMessages; end; BlockWrite(ToF,Buffer[0],NumRead); Application.ProcessMessages; Position := Position + NumRead; end; CloseFile(FromF); CloseFile(ToF); end; Dispose(p); result := 0; end; |
Re: Größe einer "unfertigen" Datei...?
Du kannst ja alle 100 Blocks ein FlushFileBuffers(Handle) einschieben.
Du brauchst dazu allerdings das Handle der Zieldatei:
Delphi-Quellcode:
FlushFileBuffers(TTextRec(ToF).Handle)
|
Re: Größe einer "unfertigen" Datei...?
mir fiel grad was auf: mein programm was das verwendet soll ne ganze liste von dateien kopieren...hab zu testzwecken mehrere klein dateien und ne große 700mb datei in die liste gesteckt. wo ich die nun kopiert hab ging der progress viel zu schnell für die 700mb-datei...als ich jetz grad nur die 700er so kopiert hab hats gestimmt...das problem muss also woanders liegen..nämle in meiner schleife für die liste:
Delphi-Quellcode:
...irgendwie wird da das copyProgressBar2.Position:=copyProgressBar2.Positi on+1 schon aufgerufen obwohl der thread noch gar ni fertig is...wie kann ich das jetz verhindern ???? reicht es da dieses FlushFile-Ding aufzurufen ???
for x:=0 to copylist2.Items.Count-1 do
begin s:=ExcludeTrailingPathDelimiter(Edit17.text+copylist2.Items[x].SubItems[1]); s:=ExcludeTrailingPathDelimiter(ExtractFilePath(s)); //Verzeichnisse erstellen if not DirectoryExists(s) then begin log.Items.Add.text:=('Erstelle Ordner: '+s); if not ForceDirectories(s) then raise Exception.Create('Verzeichnis kann nicht erstellt werden: '+ s); end; log.Items.Add.text:=(Edit17.text+copylist2.Items[x].SubItems[1]); Application.ProcessMessages; //Copy-Thread einleiten New(Params); Params.Source := copylist2.Items[x].SubItems[0]+copylist2.Items[x].SubItems[1]; Params.Dest := ExcludeTrailingPathDelimiter(Edit17.text)+copylist2.Items[x].SubItems[1]; Params.Handle := Handle; CloseHandle(BeginThread(nil, 0, @CopyExThread, Params, 0, ThreadID)); copyProgressBar2.Position:=copyProgressBar2.Position+1; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:13 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