Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Dateigröße formatieren? (https://www.delphipraxis.net/57728-dateigroesse-formatieren.html)

mlspider 25. Nov 2005 16:25


Dateigröße formatieren?
 
Hallo,

ich lasse mir die Größe einer Datei wie folgt ermitteln:

Delphi-Quellcode:
function CheckFileSize(aFilename: string): integer;
var
   f: file of Byte;
   size: Longint;
begin
AssignFile(f, aFilename);
Reset(f);
try
   size := FileSize(f);
finally
   CloseFile(f);
end;
Result := size;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 Edit1.Text := (InttoStr(CheckFileSize(Edit2.Text)));
end;
Ich möchte jetzt die Größenangabe formatieren (zb:Angabe in MB). Aber wie?

igel457 25. Nov 2005 16:35

Re: Dateigröße formatieren?
 
Mach eine Funktion FileSizeToStr:

Delphi-Quellcode:
function FileSizeToStr(size:int64):string;
begin
  if size < 1024 then result := inttostr(size)+'Byte';
  if (size > 1024) and (size < 1024*1024) then result := formatfloat('0.00',size/1024)+'KB';
  if (size > 1024*1024) and (size < 1024*1024*1024) then
   result := formatfloat('0.00',size/1024/1024)+'MB';
  if (size > 1024*1024*1024) then
   result := formatfloat('0.00',size/1024/1024/1024)+'GB';
end;
Hoffe das hilft...

mlspider 25. Nov 2005 16:37

Re: Dateigröße formatieren?
 
Und wie wäre der Aufruf in einer Procedur?

Habe Deine Funkion eingebaut. Leider gibt mir der Compiler folgende Fehlermeldung aus:

Funktion benötigt Ereignistyp

xaromz 25. Nov 2005 16:44

Re: Dateigröße formatieren?
 
Hallo,

da ist ein Fehler:
Delphi-Quellcode:
function FileSizeToStr(size:int64): String; // <- das muss noch dazu
Gruß
xaromz

Sharky 25. Nov 2005 16:45

Re: Dateigröße formatieren?
 
Hai mlspider,

da ist ein kleiner Fehler in der Deklaration. Mach aus:
Code:
function FileSizeToStr(size:int64);
einfach
Code:
function FileSizeToStr(size:int64) : String;

dahead 25. Nov 2005 16:52

Re: Dateigröße formatieren?
 
ich hab mir für diesen zweck das hier gebastelt (finde ich persönlich etwas übersichtlicher):

edit: gepostete funktion muss überarbeitet werden, daher entfernt.

Luckie 25. Nov 2005 16:55

Re: Dateigröße formatieren?
 
Ein KB hat aber 1.024 Byte und nicht 1.000. ;)

mlspider 25. Nov 2005 16:57

Re: Dateigröße formatieren?
 
Beide Funktionen sind toll. Leider komme ich mit dem Aufruf innerhalb einer Procedur nicht klar, da Int64 und TCaption inkompatibel sind.

Luckie 25. Nov 2005 16:58

Re: Dateigröße formatieren?
 
Du musst den Integer erst in einen String konvertieren mit Delphi-Referenz durchsuchenIntToStr.

mlspider 25. Nov 2005 17:01

Re: Dateigröße formatieren?
 
Hallo Luckie,

das mache ich bereits:

Delphi-Quellcode:
Edit1.Text := (InttoStr(FileSizeToStr(Edit2.Text)));
Der Compiler schluckt das ganze nicht.

xaromz 25. Nov 2005 17:05

Re: Dateigröße formatieren?
 
Hallo,

da fehlt ein Delphi-Referenz durchsuchenStrToInt:
schreib mal
Delphi-Quellcode:
Edit1.Text := FileSizeToStr(StrToInt(Edit2.Text));
Gruß
xaromz
//Edit: Fehler verbessert.

BenjaminH 25. Nov 2005 17:06

Re: Dateigröße formatieren?
 
Delphi-Quellcode:
Edit1.Text := (InttoStr(FileSizeToStr(Edit2.Text)));
So passts:
Delphi-Quellcode:
Edit1.Text := FileSizeToStr(StrtoInt(Edit2.Text));

igel457 25. Nov 2005 17:06

Re: Dateigröße formatieren?
 
@lucky :gruebel: :stupid:

Meine Funktion einfach so aufraufen:
Delphi-Quellcode:
label1.caption := filesizetostr(size);
Size ist ein integer. Edit2.Text ein String.
Mach es doch einfach so:
Delphi-Quellcode:
label1.caption := filesizetostr(strtoint(edit2.text));
Noch ein Tipp um die Große abzufragen. Du nimmst da eine recht "altmodische" Methode.

So ist es hoffentlich besser:
Delphi-Quellcode:
function CheckFileSize(aFilename: string): int64;
var
  fs:TFilestream;
begin
  fs := TFileStream.Create(afilename,fmOpenRead   )
  Result := fs.size;
  fs.free;
end;

Luckie 25. Nov 2005 17:06

Re: Dateigröße formatieren?
 
Das ist doch schon ein String: FileSizeToStr!

mlspider 25. Nov 2005 17:08

Re: Dateigröße formatieren?
 
Ja, jetzt passt es. Danke an alle.

Khabarakh 25. Nov 2005 17:35

Re: Dateigröße formatieren?
 
Zitat:

Zitat von igel457
Mach eine Funktion FileSizeToStr:

Delphi-Quellcode:
function FileSizeToStr(size:int64):string;
begin
  if size < 1024 then result := inttostr(size)+'Byte';
  if (size > 1024) and (size &lt; 1024*1024) then result := formatfloat('0.00',size/1024)+'KB';
  if (size &gt; 1024*1024) and (size &lt; 1024*1024*1024) then
   result := formatfloat('0.00',size/1024/1024)+'MB';
  if (size &gt; 1024*1024*1024) then
   result := formatfloat('0.00',size/1024/1024/1024)+'GB';
end;
Hoffe das hilft...

Viel zu lang :mrgreen: .
Delphi-Quellcode:
function FileSizeToStr(const ASize: Int64): string;
const
  Units: Array[0..8] of string = ('Byte', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB');
                                                                              // Ab hier wird es unwahrscheinlich ^^
var
  Index: Integer;
begin
  Assert(ASize >= 0);
  Index := Trunc(ln(ASize) / ln(2) / 10);
  Result := Format('%.2f %s', [ASize / (1 shl (Index * 10)), Units[Index]]);
end;
*scnr*

himitsu 25. Nov 2005 17:48

Re: Dateigröße formatieren?
 
Delphi-Quellcode:
function FileSizeToStr(size:int64):string;
begin
  if size < 1024 then result := inttostr(size)+'Byte';
  if (size > 1024) and (size > 1024*1024) then result := formatfloat
...
Da ist eh ein Fehler drin ... ihr solltet mal darauf achten, was passiert, wenn size 1024 ist :zwinker:

Neutral General 25. Nov 2005 17:52

Re: Dateigröße formatieren?
 
Delphi-Quellcode:
function FileSizeToStr(const ASize: Int64): string;
const
  Units: Array[0..8] of string = ('Byte', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB');
                                                                              // Ab hier wird es unwahrscheinlich ^^
var
  Index: Integer;
begin
  Assert(ASize >= 0);
  Index := Trunc(ln(ASize) / ln(2) / 10);
  Result := Format('%.2f %s', [ASize / (1 shl (Index * 10)), Units[Index]]);
end;
OT: Was ist denn EB, ZB und YB ? :mrgreen:
Ich kenne nur bis PetaByte :mrgreen:

Sharky 25. Nov 2005 17:56

Re: Dateigröße formatieren?
 
Zitat:

Zitat von Neutral General
... OT: Was ist denn EB, ZB und YB ?...

Ein Klick zu WiKi verrät es ;-)

mlspider 25. Nov 2005 18:02

Re: Dateigröße formatieren?
 
Immer wieder nützlich!:mrgreen:

dahead 5. Dez 2005 10:49

Re: Dateigröße formatieren?
 
Zitat:

Zitat von Khabarakh
Viel zu lang :mrgreen: .
Delphi-Quellcode:
function FileSizeToStr(const ASize: Int64): string;
const
  Units: Array[0..8] of string = ('Byte', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB');
var
  Index: Integer;
begin
  Assert(ASize >= 0);
  Index := Trunc(ln(ASize) / ln(2) / 10); // <-- hier
  Result := Format('%.2f %s', [ASize / (1 shl (Index * 10)), Units[Index]]);
end;
*scnr*

Bei meinem Delphi 7 kommt leider in der Idx Spalte ein Fehler inkompatible Typen. Ln erwartet einen Wert vom Typ Real.

dahead 6. Dez 2005 13:07

Re: Dateigröße formatieren?
 
Funktioniert der obige Code bei euch etwa?

ichbins 6. Dez 2005 14:07

Re: Dateigröße formatieren?
 
Bei mir läuft alles Super.

[OT]Der Wikipedia-Artikel (oben verlinkt) schreibt für Kilobytes die Einheit KiB vor :mrgreen:[/OT]

übrigens ist es sinnlos, so große Einheiten anzugeben, da ein int64 nur bis zu 2^64 geht, d.h. Exabytes (bis 2^69,999) würden vollkommen ausreichen.

Wenn dein Compiler einen Real erwartet, gib ihm doch einen. Mach aus 2 -> 2.0 und teile asize durch 1.0

Khabarakh 6. Dez 2005 15:02

Re: Dateigröße formatieren?
 
Die System-Routinen scheinen wohl bis D2005 ein Problem mit Int64 zu haben, nicht einmal ein explicit Cast funktioniert. Über eine Real-Variable (bzw. gleich als Parameter) oder eine nicht-ASM Funktion funktioniert die Routine aber auch mit meinem Delphi 6:
Delphi-Quellcode:
Index := Trunc(Math.LogN(2, ASize) / 10);
Zitat:

Zitat von ichbins
übrigens ist es sinnlos, so große Einheiten anzugeben, da ein int64 nur bis zu 2^64 geht, d.h. Exabytes (bis 2^69,999) würden vollkommen ausreichen.

Der Kommentar im Code ist nicht zufällig genau so eingerückt, wie er oben steht.
Zitat:

Zitat von ichbins
[OT]Der Wikipedia-Artikel (oben verlinkt) schreibt für Kilobytes die Einheit KiB vor :mrgreen:[/OT]

Und wer hält sich daran :wink: ? Bevor ich den User komplett verwirre, gebe ich lieber eine streng genommen falsche Einheit aus.

ichbins 6. Dez 2005 15:08

Re: Dateigröße formatieren?
 
Da steht aber nur unwahrscheinlich ;)

Eigentlich gehört ein unmöglich hin. Unwahrscheinlich wird es nämlich schon etwas früher.

dahead 6. Dez 2005 16:33

Re: Dateigröße formatieren?
 
Zitat:

Zitat von Khabarakh
Die System-Routinen scheinen wohl bis D2005 ein Problem mit Int64 zu haben, nicht einmal ein explicit Cast funktioniert. Über eine Real-Variable (bzw. gleich als Parameter) oder eine nicht-ASM Funktion funktioniert die Routine aber auch mit meinem Delphi 6:
Delphi-Quellcode:
Index := Trunc(Math.LogN(2, ASize) / 10);

ja, so klappt es bei mir auch. Danke!


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:01 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