AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Probleme mit filestream.seek und int64

Ein Thema von bono_82 · begonnen am 27. Mär 2007 · letzter Beitrag vom 5. Apr 2007
Antwort Antwort
Seite 1 von 2  1 2      
bono_82

Registriert seit: 11. Dez 2005
17 Beiträge
 
#1

Probleme mit filestream.seek und int64

  Alt 27. Mär 2007, 08:25
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
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#2

Re: Probleme mit filestream.seek und int64

  Alt 27. Mär 2007, 08:32
Stellt sich mir die Frage, was soll zB. int64(i) bewirken und was ist i ein Integer?
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
pszopp

Registriert seit: 7. Sep 2005
Ort: Alsdorf
95 Beiträge
 
Delphi 2010 Professional
 
#3

Re: Probleme mit filestream.seek und int64

  Alt 27. Mär 2007, 08:38
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
www.pstipp.de | Tippseite zur Formel 1 und Fußball WM/EM - kostenlos und Just-For-Fun
  Mit Zitat antworten Zitat
Benutzerbild von gsh
gsh

Registriert seit: 24. Okt 2004
1.542 Beiträge
 
Delphi XE Architect
 
#4

Re: Probleme mit filestream.seek und int64

  Alt 27. Mär 2007, 08:51
Wenn des nicht hilft dann könntest du auch mal statt seek position verwenden

SourceFile.Position := (I * 512); Was ist überhaupt I? Integer oder int64?
Alex
"Sage nicht alles, was du weißt, aber wisse alles, was du sagst!" Matthias Claudius
"Wer sich über Kritik ärgert, gibt zu, daß er sie verdient hat." Tacitus
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#5

Re: Probleme mit filestream.seek und int64

  Alt 27. Mär 2007, 09:11
Hallo,

versuche es mal so:

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
  Mit Zitat antworten Zitat
Benutzerbild von gsh
gsh

Registriert seit: 24. Okt 2004
1.542 Beiträge
 
Delphi XE Architect
 
#6

Re: Probleme mit filestream.seek und int64

  Alt 27. Mär 2007, 09:26
Man bin ich dumm ... vergiss meinen ersten post
Mir ist gerade was eingefallen
Wenn du Read 512 Byte aufrufst dann wird die Position angepasst
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.

//edit: Fehler ausgebessert und wichtige Stelle fett markiert
Alex
"Sage nicht alles, was du weißt, aber wisse alles, was du sagst!" Matthias Claudius
"Wer sich über Kritik ärgert, gibt zu, daß er sie verdient hat." Tacitus
  Mit Zitat antworten Zitat
bono_82

Registriert seit: 11. Dez 2005
17 Beiträge
 
#7

Re: Probleme mit filestream.seek und int64

  Alt 5. Apr 2007, 09:52
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!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#8

Re: Probleme mit filestream.seek und int64

  Alt 5. Apr 2007, 10:06
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
SourceFile.Position := int64(i) * 512;
$2B or not $2B
  Mit Zitat antworten Zitat
bono_82

Registriert seit: 11. Dez 2005
17 Beiträge
 
#9

Re: Probleme mit filestream.seek und int64

  Alt 5. Apr 2007, 10:14
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.
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#10

Re: Probleme mit filestream.seek und int64

  Alt 5. Apr 2007, 10:14
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 11:50 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