Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Probleme mit filestream.seek und int64 (https://www.delphipraxis.net/89182-probleme-mit-filestream-seek-und-int64.html)

bono_82 27. Mär 2007 07:25


Probleme mit filestream.seek und int64
 
Hallo,

ich will über TFileStream auf eine ca. 3-4 GB große Datei (Image einer Speicherkarte) zugreifen.
Logisch ist die Datei wie die Speicherkarte in Sektoren a 512 Byte eingeteilt. Hier mal der Problemausschnitt:

Delphi-Quellcode:
...
 i:=StartSector;
 while (i<EndSector_SD+1) and not terminated do
    begin
        if flag_filemode = true then
         begin
          //Datei scannen
          SourceFile.Seek(int64(i) * int64(512), soFromBeginning);
          SourceFile.Read(buffer,512);                              //buffer ist ein array[0..511] of byte;

         end;
...
Es werden immer 512 Byte aus dem Stream entnommen und in ein Buffer geschoben. Das funktioniert auch alles prima, nur wenn für den StartSector eine Wert größer ab ca. 4190000 (ergibt mit 512 multipliziert die Grenze von integer)eingegeben wird, geht seek wieder an den Dateianfang. Wie gesagt, wenn ich bei Werten kleiner ca. 4190000 anfange zu scannen klappt alles bis zum gewünschten EndSector (ca. 6000000) wunderbar. Ist das vielleicht ein Delphi-Bug? Ich benutze Delphi 2005 Prof..
Hat jemand diesbezüglich eine Idee? Grüße

turboPASCAL 27. Mär 2007 07:32

Re: Probleme mit filestream.seek und int64
 
Stellt sich mir die Frage, was soll zB. int64(i) bewirken und was ist i ein Integer?

pszopp 27. Mär 2007 07:38

Re: Probleme mit filestream.seek und int64
 
Hallo Bono,

Der Zugriff auf das Array ist meiner Meinung nach auch nicht korrekt:
Delphi-Quellcode:
// So Sollte es besser sein:
SourceFile.Read(buffer[0],512); // Bei Arrays immer den ersten Index angeben
Gruß,
pszopp

gsh 27. Mär 2007 07:51

Re: Probleme mit filestream.seek und int64
 
Wenn des nicht hilft dann könntest du auch mal statt seek position verwenden

Delphi-Quellcode:
SourceFile.Position := (I * 512);
Was ist überhaupt I? Integer oder int64?

Hawkeye219 27. Mär 2007 08:11

Re: Probleme mit filestream.seek und int64
 
Hallo,

versuche es mal so:

Delphi-Quellcode:
S.Seek (Int64(i) * 512, soBeginning);
Beachte den zweiten Parameter: soBeginning statt soFromBeginning!

Borland hat die Seek-Methode überladen. Durch die Verwendung von soFromBeginning wird die "alte" Methode aufgerufen, die 64-Bit-Werte für den ersten Parameter auf 32 Bit stutzt.

Gruß Hawkeye

gsh 27. Mär 2007 08:26

Re: Probleme mit filestream.seek und int64
 
Man bin ich dumm ... vergiss meinen ersten post :stupid:
Mir ist gerade was eingefallen
Wenn du Read 512 Byte aufrufst dann wird die Position angepasst
Zitat:

Zitat von Delphi Hilfe
Mit Read können Daten aus einer Datei gelesen werden, die dem Handle-Stream zugeordnet ist und deren Größe in Byte nicht bekannt ist. Beginnend an der aktuellen Position werden maximal so viele Bytes gelesen, wie mit Count angegeben. Anschließend wird die aktuelle Dateiposition der tatsächlich übertragenen Byte-Anzahl angepasst.

Du kannst einfach das ganze seek und position raushauen und einfach alles nacheinander Auslesen. :zwinker:

//edit: Fehler ausgebessert und wichtige Stelle fett markiert

bono_82 5. Apr 2007 08:52

Re: Probleme mit filestream.seek und int64
 
Erstmal sorry, dass ich nicht auf eure Posts
reagiert habe. Hatte vergessen die Benachrichtigung einzuschalten und
durch Zufall jetzt mitbekommen, dass doch Antworten kamen. Also, Entschuldigung!

Der Tipp mit Position war gut. Ich hab nur "seek" durch "position" ersetzt und damit gehts
komischerweise wunderbar. Vielleicht ist Delphi 2005 mit Int64 bisschen bugig...

Delphi-Quellcode:
SourceFile.Position   :=   int64(i) * int64(512);
SourceFile.Read(buffer,512);
Besten Dank für eure Hilfe!

himitsu 5. Apr 2007 09:06

Re: Probleme mit filestream.seek und int64
 
Zitat:

Zitat von bono_82
Vielleicht ist Delphi 2005 mit Int64 bisschen bugig

Nein, ist es nicht ... das ist überall so.

es wird ja der Reihe nach gerechnet und wenn i ein LongInt/Integer ist,dann wird auch mit dieser Größe gerechnet.
Erst bei der Zuweisung des Ergebnisses an einen Int64 wird dieses in Int64 umgerechnet.
Delphi-Quellcode:
var i: Integer;

// Delphi macht aus
SourceFile.Position := i * 512;

// demnach nur dieses
SourceFile.Position := Int64(i * 512);
Du mußt also erst dein i in einen int64 umwandeln, wenn du größere Werte haben möchtest.

So reichts also auch
Delphi-Quellcode:
SourceFile.Position := int64(i) * 512;

bono_82 5. Apr 2007 09:14

Re: Probleme mit filestream.seek und int64
 
Zitat:

Du mußt also erst dein i in einen int64 umwandeln, wenn du größere Werte haben möchtest.
...ja, das habe ich aber auch schon in meinem 1. Thread mit der "seek" Variante getan.

Mit int64(512) war ich mir nicht so sicher, habs deswegen lieber nochmal seperat gecastet.

Robert Marquardt 5. Apr 2007 09:14

Re: Probleme mit filestream.seek und int64
 
Was dich hier trifft ist das Seek in zwei overloaded Varianten vorhanden ist. Seek mit 32-Bit und Seek mit 64-Bit. Wenn du soFromBeginning verwendest, dann ist dies eine Integer-Konstante und es wird die 32-bit Variante genommen. Verwendest du soBeginning vom Typ TSeekOrigin, dann wird die 64-bit Variante genommen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:33 Uhr.
Seite 1 von 2  1 2      

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