Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Größe einer "unfertigen" Datei...? (https://www.delphipraxis.net/68351-groesse-einer-unfertigen-datei.html)

Adversus 28. Apr 2006 12:24


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

jim_raynor 28. Apr 2006 12:30

Re: Größe einer "unfertigen" Datei...?
 
Habe nach Hier im Forum suchenShFileOperation CallBack gesucht und diesen Beitrag gefunden:

http://www.delphipraxis.net/internal...ation+callback

leider scheint es mit dieser Funktion nicht zu klappen. Allerdings kannst du dir ja deine eigene Kopierfunktion basteln. Denke mal, dass man über Hier im Forum suchenDatei kopieren Fortschritt etwas passendes findet.

Adversus 28. Apr 2006 12:50

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:
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;
Vielleicht kann mir ja einer sagen wie man das hinbekommt das der progress auch im LAN stimmt ????

shmia 28. Apr 2006 13:07

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)

Adversus 28. Apr 2006 13:19

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:
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;
...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 ???


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