AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi FileStream.Size ist negativ (Datei größer als 2GB)
Thema durchsuchen
Ansicht
Themen-Optionen

FileStream.Size ist negativ (Datei größer als 2GB)

Ein Thema von endeffects · begonnen am 19. Mär 2005 · letzter Beitrag vom 20. Mär 2005
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von Binärbaum
Binärbaum

Registriert seit: 19. Jan 2005
Ort: Elstra
764 Beiträge
 
Delphi 7 Enterprise
 
#11

Re: FileStream.Size ist negativ (Datei größer als 2GB)

  Alt 19. Mär 2005, 20:31
Zitat von NicoDE:
Zitat von Binärbaum:
Hier mal eine Funktion, die den negativen Wert in die richtige Entsprechung umrechnet
Man könnte das ganze kompatibler gestalten, indem man einen Int64 zurückgibt und eine überladene Funktion mit einem Int64 als Paramater schreibt (falls das Property von TFileStream in einer anderen Delphi-Version tatsächlich Int64 liefert...).

edit: ein Int64(Longword(aSize)) hätte es auch getan, die Additionen sorgen nur für Probleme bei aktivierten Overflow-Checks.
Nunja, Int64 ist aber in der Hinsicht nicht ganz sinnvoll, da ein Int64 ja auch negative Werte annehmen kann, aber es keine Dateien gibt, die eine negative Größe haben. Int64 ist wie gesagt nur dann nötig, wenn die Datei größer als 4GB ist, ansonsten reicht Longword. (AFAIK können Dateien unter Win9x/ME und WinNT nicht größer als 4GB sein, wie das bei WinXP aussieht, weiß ich nicht )
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:
  else Result:= 2147483647 + LongWord(aSize+2147483648); Damit ist man dann auf der sicheren Seite.

MfG
Binärbaum
There are exactly 10 kinds of people: those who understand binary, and those who don't.
---
"Software reift beim Kunden. Bei Hardware ist es anders: Hardware fault beim Kunden." - Rainer G. Spallek
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#12

Re: FileStream.Size ist negativ (Datei größer als 2GB)

  Alt 19. Mär 2005, 20:47
Zitat von Binärbaum:
Nunja, Int64 ist aber in der Hinsicht nicht ganz sinnvoll, da ein Int64 ja auch negative Werte annehmen kann, aber es keine Dateien gibt, die eine negative Größe haben. Int64 ist wie gesagt nur dann nötig, wenn die Datei größer als 4GB ist, ansonsten reicht Longword. (AFAIK können Dateien unter Win9x/ME und WinNT nicht größer als 4GB sein, wie das bei WinXP aussieht, weiß ich nicht )
Das High-Bit (wieviele TB bzw. PB sind das?) wird AFAIK von Windows ohnehin nicht interstützt. Und Delphi32 hat nunmal keinen UInt64
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#13

Re: FileStream.Size ist negativ (Datei größer als 2GB)

  Alt 20. Mär 2005, 12:57
Zitat von endeffects:
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
In welchem Kontext tritt Dein "Fehler" auf? Mit D7 funktioniert es auf jeden Fall:
Delphi-Quellcode:
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;
Ausgabe:
Code:
---------------------------
Project1
---------------------------
Filesize base.img: 4278190080
---------------------------
OK  
---------------------------
Ansonsten hier eine Funktion zur Rückgabe der Größe einer beliebigen Datei:
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;
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:54 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