![]() |
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:
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..
...
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; ... Hat jemand diesbezüglich eine Idee? Grüße |
Re: Probleme mit filestream.seek und int64
Stellt sich mir die Frage, was soll zB. int64(i) bewirken und was ist i ein Integer?
|
Re: Probleme mit filestream.seek und int64
Hallo Bono,
Der Zugriff auf das Array ist meiner Meinung nach auch nicht korrekt:
Delphi-Quellcode:
Gruß,
// So Sollte es besser sein:
SourceFile.Read(buffer[0],512); // Bei Arrays immer den ersten Index angeben pszopp |
Re: Probleme mit filestream.seek und int64
Wenn des nicht hilft dann könntest du auch mal statt seek position verwenden
Delphi-Quellcode:
Was ist überhaupt I? Integer oder int64?
SourceFile.Position := (I * 512);
|
Re: Probleme mit filestream.seek und int64
Hallo,
versuche es mal so:
Delphi-Quellcode:
Beachte den zweiten Parameter: soBeginning statt soFromBeginning!
S.Seek (Int64(i) * 512, soBeginning);
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 |
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:
//edit: Fehler ausgebessert und wichtige Stelle fett markiert |
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:
Besten Dank für eure Hilfe!
SourceFile.Position := int64(i) * int64(512);
SourceFile.Read(buffer,512); |
Re: Probleme mit filestream.seek und int64
Zitat:
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:
Du mußt also erst dein i in einen int64 umwandeln, wenn du größere Werte haben möchtest.
var i: Integer;
// Delphi macht aus SourceFile.Position := i * 512; // demnach nur dieses SourceFile.Position := Int64(i * 512); So reichts also auch
Delphi-Quellcode:
SourceFile.Position := int64(i) * 512;
|
Re: Probleme mit filestream.seek und int64
Zitat:
Mit int64(512) war ich mir nicht so sicher, habs deswegen lieber nochmal seperat gecastet. |
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 18:45 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