![]() |
FileStream.Size ist negativ (Datei größer als 2GB)
Hallo,
ich hab leider ein Problem beim Einlesen einer Datei (über 2GB) in einen FileStream, wenn ich mit Hilfe von FileStream.Size die Größe des Streams ermittel möchte erhalte ich einen negativen Wert. Reicht es diesen Wert in einen positiven umzuwandeln oder muss eine andere Lösung erhalten? MfG |
Re: FileStream.Size ist negativ (Datei größer als 2GB)
Hai endeffects,
welche Delphi-Version hast Du denn? Gab es nicht bis D7 diese beschränkung? |
Re: FileStream.Size ist negativ (Datei größer als 2GB)
ich habe D7
|
Re: FileStream.Size ist negativ (Datei größer als 2GB)
Hmmm.... bei mir geht es ohne Fehler:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var blubb : TFileStream; begin if (OpenDialog1.Execute) then begin blubb := TFileStream.Create(OpenDialog1.FileName,fmOpenRead); try ShowMessage (Format ('Dateigröße %d kB',[blubb.Size DIV 1024])); finally blubb.Free; end; end; end; |
Re: FileStream.Size ist negativ (Datei größer als 2GB)
Schwierig.. speicherst du die Größe des Streams in einem Integer-Wert oder wird die as Integer-Wert verarbeitet? Wenn ja: unbedingt Int64 benutzen. Der generische signed-32Bit-Typ Integer geht nämlich nur bis 2^31-1 im positiven, also nur bis 2GB ;)
|
Re: FileStream.Size ist negativ (Datei größer als 2GB)
hallo,
das problem wird durch die abfrage von filestream.size erzeugt, der wert ist ja nunmal leider nur ein longint.
Delphi-Quellcode:
im fall von N<0 multipliziere ich den wert momentan einfach mit -1,
SrcStream:=TFileStream.Create(FileName,fmOpenread or fmShareDenyNone);
N:=SrcStream.Size; while N>0 do ... ich vermute allerdings dass das so nicht ganz richtig ist *g |
Re: FileStream.Size ist negativ (Datei größer als 2GB)
Zitat:
|
Re: FileStream.Size ist negativ (Datei größer als 2GB)
Zitat:
|
Re: FileStream.Size ist negativ (Datei größer als 2GB)
IMHO sollte es reichen, Size nach LongWord zu casten, damit können Werte bis 2^32-1 dargestellt werden (entspricht 4GB). Ansonsten sollte man Int64 verwenden (falls die Datei noch größer ist).
Hier mal eine Funktion, die den negativen Wert in die richtige Entsprechung umrechnet:
Delphi-Quellcode:
MfG
function RealeGroesse(aSize: LongInt): Longword;
begin if aSize>=0 then Result:= aSize else Result:= 2147483647 + (aSize+2147483648); end; Binärbaum |
Re: FileStream.Size ist negativ (Datei größer als 2GB)
Zitat:
edit: ein Int64(Longword(aSize)) hätte es auch getan, die Additionen sorgen nur für Probleme bei aktivierten Overflow-Checks.
Delphi-Quellcode:
function HackIt(Size: Longint): Int64; overload;
{$IFDEF WIN32} asm xor edx, edx end; {$ELSE} begin Result := Longword(Size); end; {$ENDIF} function HackIt(Size: Int64): Int64; overload; {$IFDEF WIN32} asm // fixme :) end; {$ELSE} begin Result := Size; end; {$ENDIF} |
Re: FileStream.Size ist negativ (Datei größer als 2GB)
Zitat:
Und wegen dem Overflow: der sollte eigentlich nicht auftreten, denn wenn man zu einem negativen Wert 2 Mrd. addiert, ist man immer noch unter 2 Mrd. und somit auch noch im Bereich von LongInt. Notfalls kann die Zeile ja so abgeändert werden:
Delphi-Quellcode:
Damit ist man dann auf der sicheren Seite.
else Result:= 2147483647 + LongWord(aSize+2147483648);
MfG Binärbaum |
Re: FileStream.Size ist negativ (Datei größer als 2GB)
Zitat:
|
Re: FileStream.Size ist negativ (Datei größer als 2GB)
Zitat:
Delphi-Quellcode:
Ausgabe:
procedure TForm1.Button1Click(Sender: TObject);
var Stream : TFileStream; begin Stream := TFileStream.Create('e:\tlinux4\base.img', fmOpenRead); ShowMessage(Format('Filesize %s: %d', ['base.img', Stream.Size])); Stream.Free; end;
Code:
Ansonsten hier eine Funktion zur Rückgabe der Größe einer beliebigen Datei:
---------------------------
Project1 --------------------------- Filesize base.img: 4278190080 --------------------------- OK ---------------------------
Delphi-Quellcode:
function DiskFileSize(FileName : string) : int64;
var handle : THandle; findData : TWin32FindData; begin Result := -1; handle := FindFirstFile( PChar( FileName ), findData ); if ( handle <> INVALID_HANDLE_VALUE ) then begin Windows.FindClose( handle ); if ( ( FindData.dwFileAttributes AND FILE_ATTRIBUTE_DIRECTORY ) = 0 ) then begin Result := (findData.nFileSizeHigh * MAXDWORD)+ findData.nFileSizeLow; end; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:27 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