Laden...

Position und Length in Stream bei sehr großen Dateien > 4GB

Erstellt von Quaneu vor 8 Jahren Letzter Beitrag vor 8 Jahren 1.396 Views
Quaneu Themenstarter:in
692 Beiträge seit 2008
vor 8 Jahren
Position und Length in Stream bei sehr großen Dateien > 4GB

Hallo zusammen,

ich habe eine Frage zu den beiden Properties Length und Position in der Klasse Stream.

Wie verhalten sich diese wenn die Datei sehr groß ist?
Z.B. wenn die Datei 5GB groß ist und ich nun die Position auf die vorletzte Stelle setzten will. Position und Length sind vom Typ long, daher ist es mir nicht ganz klar wie das gehen soll...

Ich will die Datei auch nicht auf einmal lesen, sondern nur gewisse Ausschnitte. Aber diese können sich an beliebigen Stellen in der Datei befinden, eben auch am Ende. Das andere ist, dass es in der Datei Offsets gibt, die vom Typ ulong sind und damit nicht "kompatible" zur Position ist.

Schöne Grüße und vielen Dank
Quaneu

5.658 Beiträge seit 2006
vor 8 Jahren

Hi Quaneu,

die beiden Eigenschaften gibt es doch gar nicht beim BinaryReader, sondern nur bei dem darunterliegenden Stream. In der Stream-Basisklasse sind beide Eigenschaften vom Typ Int64 / long.

Christian

Weeks of programming can save you hours of planning

Quaneu Themenstarter:in
692 Beiträge seit 2008
vor 8 Jahren

Hallo MrSparkle,

Du hast vollkommen recht, daher habe ich meinen Post angepasst.
Aber meine Frage bleibt leider trotzdem bestehen, selbst wenn Langth vom Typ long ist. Aber vielen Dank für den Hinweis 😃

Schöne Grüße
Quaneu

6.911 Beiträge seit 2009
vor 8 Jahren

Hallo Quaneu,

ich würde hier gar nicht mit dem BinaryReader arbeiten, sondern Memory-Mapped Files verwenden. Hast du diese Technik schon in Betracht gezogen?

Position und Length sind vom Typ long, daher ist es mir nicht ganz klar wie das gehen soll...

Hast du das nicht ganz angepasst? Sofern der Stream die Length- und Position-Eigenschaft unterstütz, kann der Wert doch einfach gesetzt werden od. was meinst du hier genau?

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

Quaneu Themenstarter:in
692 Beiträge seit 2008
vor 8 Jahren

Hallo gfoidl,

noch nicht, da ich glaube das sie nicht das Richtige sind.

Ich benutze den BinaryReader um eine Binärdatei zu lesen, diese können sehr groß sein, wobei mich nur kleine Ausschnitte in der Datei interessieren. Diese können jedoch sehr zerstreut in der Datei abgelegt sein. Wo ich was finde steht auch in der Datei, d.h. ich springe in der Datei immer wild hin und her. Diese Offsets sind jedoch als ulong angegeben da das Format Datein unterstütz die größer als 4 GB sind.
Meine Frage ist daher wie ich in so einer Datei die Position setzten kann?
Ich muss ja irgendwo


Reader.Position = (long)Offset;

schreiben. Und das bereitet mir gerade etwas Kopfschmerzen. Oder kommt der BinaryReader damit klar, wenn die Position negativ wird?

Schöne Grüße
Quaneu

5.658 Beiträge seit 2006
vor 8 Jahren

Wieso sollte denn eine Position in einer Datei einen negativen Wert haben?
Wenn es sich um relative Positionsangaben handelt, mußt du sie eben korrekt umrechnen. Das ist nur eine Addition!

Christian

Weeks of programming can save you hours of planning

1.361 Beiträge seit 2007
vor 8 Jahren

Hey Quaneu,

da long = System.Int64 ist und System.Int64.MaxValue = 9,223,372,036,854,775,807 ist, kannst du Dateien mit über 8 Millionen Terabyte ansprechen.

Vielleicht hast du C#'s long mit C++'s long verwechselt, welcher auf den meisten Plattformen ein int32_t ist.

Beste Grüße
zommi

Quaneu Themenstarter:in
692 Beiträge seit 2008
vor 8 Jahren

Hi zoomi,

das ist es... wie peinlich...
Daher meine jetzt unbegründete Besorgnis. Solche Datein sollten es in naher Zukunft nicht geben 😉. Vielen Dank für eure Hilfe. D.h. der cast von ulong auf long sollte wirklich keine Probleme machen, da er immer im Bereich von long liegen muss.

Schöne Grüße
Quaneu