Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi filesize summieren und von byte nach Mb rechnen (https://www.delphipraxis.net/12165-filesize-summieren-und-von-byte-nach-mb-rechnen.html)

sharkx 21. Nov 2003 22:17


filesize summieren und von byte nach Mb rechnen
 
Hallöle ..

Ich weiß das..
8 Bit = 1 Byte
1024 byte = 1KB
1024KB = 1Mb
sind, aber nun habe ich heute im Netz gelesen, das man mit Delphi nicht mit diesen zahlen rechnen soll, sondern 1Kb = 1000Byte nehmen soll, warum auch immer?!


nun zu dem eigentlichen problem.

Delphi-Quellcode:

// Result = byte
function GetFileSize(FileName: String): Integer;
var
  SR: TSearchRec;

begin
  if FindFirst(Filename, faAnyFile, SR) = 0 then
    begin
      Result := SR.Size;
    end
  else
    begin
      Result := -1;
    end;
  FindClose(SR);
end;


// Complete Bar enthällt nicht die tatsächliche Grösse aller in der SFV File befindlichen dateien
Function Status(Wert: Integer; FileSize: Integer): String;
Var
  I: Integer;

Begin
  If Wert = sfvfile.count then
    Result := '[AA] - ( ' + IntToStr(sfvfile.count) + 'F ' + IntToStr(FileSize div 1024 div 1024) + 'M - COMPLETE ) - [AA]'
  else
    Begin
      Result := '[';
        for i := 0 to (((Wert * sfvfile.count) div 100) div 10)-1 do
          Result := Result + '#';
        for i := (((Wert * sfvfile.count) div 100) div 10)+1 to 10 do
          Result := Result + '-';
          Result := Result + '] - ' + IntToStr((Wert * sfvfile.count) div 100) + '% Complete - [AA]';
    end;
  OldStatus := Result;
End;


// und so zähle ich die filesize hoch ...
var
  FSize : Integer;
  dir  : String;         // enthällt den Pfad zur Datei
  filen : String;         // der Dateinamen

begin
...

  FSize := FSize + GetFileSize(dir + filen);

end;

Als beispiel habe ich einen ordner mit Gesammtgrösse der Dateien von 4,6GB genommen. Als Ergebniss in dem Statusbalken bekomme ich aber 52MB raus.

Wo liegt das Problem bzw was hab ich da falsch gemacht?

scp 21. Nov 2003 22:25

Re: filesize summieren und von byte nach Mb rechnen
 
Ein Integer geht nur bis 2147483647 Byte = 2097152 KByte = 2048 MB = 2 GB

Deshalb würde ich Int64 verwenden, der geht bis 2^63 = 8589934592 GB = 8388608 TB.

sharkx 21. Nov 2003 22:27

Re: filesize summieren und von byte nach Mb rechnen
 
Oh Ok! Das habe ich überhaupt nicht beachtet *g*

Vielen dank

Christian Seehase 21. Nov 2003 22:40

Re: filesize summieren und von byte nach Mb rechnen
 
Moin Sharkx,

Zitat:

Zitat von sharkx
...sondern 1Kb = 1000Byte nehmen soll, warum auch immer?!

Wo hast Du denn das gelesen?
Der einzige Grund, den ich mir denken kann, liegt nicht in Delphi begründet, sondern darin, dass viele Hersteller bei GB nicht 1024^3 sondern 1000^3 rechnen (z.B. bei der Grössenangabe von DVD-R), so dass bei mancher Anwendung die 1000 Sinn macht.

sharkx 21. Nov 2003 22:55

Re: filesize summieren und von byte nach Mb rechnen
 
Ich weiß nicht mehr genau auf welcher Seite das war. Ich hatte nach meiner lösung des problems gegoogelt und stoß da auf eine GetFileSize funktion die den wert gleich umrechnet. Da stand dieses dabei. Aber schlag mich tot .. ich weiß die URL nicht mehr :/

himitsu 21. Nov 2003 23:05

Re: filesize summieren und von byte nach Mb rechnen
 
Hi,

wie rufst due denn
Delphi-Quellcode:
Function Status(Wert: Integer; FileSize: Integer): String;
auf?

sharkx 21. Nov 2003 23:16

Re: filesize summieren und von byte nach Mb rechnen
 
Delphi-Quellcode:
 ForceDirectories(dir + Status(FileOK, FSize));
Habs aber danke scp hinbekommen. Wenn der Wert über dem zulässigen Integer wert ist, kanns nich gut gehen ;)

himitsu 21. Nov 2003 23:32

Re: filesize summieren und von byte nach Mb rechnen
 
hab noch was anderes für dich:

Freigabe von SearchRec berichtigt (siehe Beispiel in der OH):
Delphi-Quellcode:
  Function GetFileSize(FileName: String): Integer;
    Var SR: TSearchRec;

    Begin
      If FindFirst(Filename, faAnyFile, SR) = 0 Then Begin
        Result := SR.Size;
{}      FindClose(SR);
      End Else Result := -1;
    End;
Ein bissl Codeoptinierung:
Delphi-Quellcode:
  Function Status(Wert: Integer; FileSize: Int64): String;
    Var I: Integer;

    Begin
      If Wert = sfvfile.count Then
{}      Result := '[AA] - ( ' + IntToStr(sfvfile.count) + 'F ' + IntToStr(FileSize shr 20) + 'M - COMPLETE ) - [AA]'
      Else Begin
        Result := '[';
{}      For I := 1 to ((Wert * sfvfile.count) div 1000) do
          Result := Result + '#';
{}      For I := ((Wert * sfvfile.count) div 1000) + 1 to 10 do
          Result := Result + '-';
{}      Result := Result + '] - ' + IntToStr((Wert * sfvfile.count) div 100) + '% Complete - [AA]';
      End;
      OldStatus := Result;
    End;
Delphi-Quellcode:
{10 Bit = 1024}
X div 1024 div 1024 = X shr 20 {arbeitet schneller}


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:36 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz