Registriert seit: 26. Mai 2004
3.159 Beiträge
|
Re: Dateigröße als String ausgeben
13. Feb 2010, 12:17
Zitat von DeddyH:
Gute Idee.
Delphi-Quellcode:
function GetFileSizeAsString(const FileName: string; Use1024: Boolean = true): string;
const Sizes1024: array[0..7] of string = ('KiB','MiB','GiB','TiB','PiB','EiB','ZiB','YiB');
Sizes1000: array[0..7] of string = ('KB','MB','GB','TB','PB','EB','ZB','YB');
var
Size: Extended;
_Unit: integer;
S: string;
Divisor: Integer;
fStream: TFileStream;
begin
if not FileExists(FileName) then
begin
Result := 'FNE';
Exit;
end;
try
if Use1024 then
Divisor := 1024
else
Divisor := 1000;
fStream := TFileStream.Create(FileName,fmOpenRead or fmShareDenyNone);
try
Size := fStream.Size / Divisor;
finally
fStream.Free;
end;
_Unit := Low(Sizes1024);
while (Size >= Divisor) and (_Unit < High(Sizes1024)) do
begin
Size := Size / Divisor;
Inc(_Unit);
end;
if Use1024 then
S := Sizes1024[_Unit]
else
S := Sizes1000[_Unit];
Result := Format('%.2f %s',[Size,S]);
except
Result := 'ERR';
end;
end;
[edit] den Filename-Parameter als const definiert. [/edit]
Deine Methode ist leider falsch Dein Stream gibt die Bytes und keine KiloBytes zurück. Du fängst bei deiner Zählung aber schon mit KB an. Somit kommt immer eine Einheit größer raus, als es sollte. Habe mir gerade über eine 7,1 TiB große Datei gewundert.
Zudem habe ich die Formatierung von der Ermittlung der Dateigröße getrennt:
Delphi-Quellcode:
{ Diese Methode gibt die Dateigröße in Byte zurück. Dafür wird intern TFileStream verwendet, um auch
unter Linux lauffähig zu sein. }
function GetFileSize( const AFileName: String): Int64;
var
fileStream: TFileStream;
begin
if ( not FileExists(AFilename)) then
raise Exception.Create(' File does not exist.');
// TFileStream nutzen, sodass das Ding auch unter Linux laufen könnte ;)
fileStream := TFileStream.Create(AFileName,fmOpenRead or fmShareDenyNone);
try
Result := fileStream.Size;
finally
fileStream.Free();
end;
end;
{ Diese Methode formatiert die Dateigröße und nutzt dafür das passende Format. Hier kann zudem auch
noch angegeben werden, ob mit 2^10 oder 1000 gerechnet werden soll, was sich auf die Einheit
auswirkt. }
function FormatFileSize( const AFileSize: Int64; Use1024: Boolean = True): String;
const
Sizes1024: array[0..8] of string = (' Bytes', ' KiB',' MiB',' GiB',' TiB',' PiB',' EiB',' ZiB',' YiB');
Sizes1000: array[0..8] of string = (' Bytes', ' KB',' MB',' GB',' TB',' PB',' EB',' ZB',' YB');
var
_size: Extended;
_Unit: integer;
s: string;
Divisor: Integer;
begin
try
if (Use1024) then
Divisor := 1024
else
Divisor := 1000;
_size := AFileSize;
_Unit := Low(Sizes1024);
while (_size >= Divisor) and (_Unit < High(Sizes1024)) do
begin
_size := _size / Divisor;
Inc(_Unit);
end;
if (Use1024) then
s := Sizes1024[_Unit]
else
s := Sizes1000[_Unit];
Result := Format(' %.2f %s', [_size, s]);
except
Result := ' ERR';
end;
end;
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
|