![]() |
Blockread oder Tfilestream was nu ???
hallo leute, habe mal folgende frage
ich progge grad an einem diskeditor herum. habe ihm mit array's , blockread und stringgrid realisiert. klappt auch, aber der ganze syncro zwischen darstellung, array und blockwrite ist ganz schoen lästig, zudem stelle ich immer nur eine begrezte anzahl von bytes auf dem bildschirm dar, sodas im stringgrid nich gescrollt werden muss oder kann, eine tastendruck zeigt dann die naechste seite an. ich hätte es aber gern so, das ich einen scrollbalken habe mit dem ich die datei im grid von anfang bis ende mit scrollen anschauen kann hier meine fragen 1. worin liegt der unterschied oder vorteil zwischen blockread und tfilestream ? bzw. ihrer einsatzgebiete 2. kann ich ein stringgrid so mit tfilestream verketten, das er die ganze datei, sagen wir mal 700 mb mit dem grid verknüpft, und bei betaetigung der scrollbalkens, automatisch die position in der datei,anspringt, die daten lädt und im grid darstellt |
Re: Blockread oder Tfilestream was nu ???
Also zu 1.:
Ich glaube bei TFileStream ist das so, dass da die ganze Datei in den Stream geladen wird und bei BlockRead eben nur Blockweise, bin mir aber nicht ganz sicher :roll: |
Re: Blockread oder Tfilestream was nu ???
Moin Richard,
intern greifen beide Varianten auf die gleichen API Funktionen zu. Die BlockRead Version ist noch ein Überbleibsel aus der Pascal Zeit, und man muss sich, z.B., um IOResult selber kümmern. TFileStream ist die "modernere" Kapselung der API im Umgang mit Dateien. Schau Dir an, was Dir am Besten liegt. Vielleicht schaust Du Dir auch mal MemoryMappedFiles an. ( ![]() Bei 700MB müsstest Du die Daten sowieso nach und nach einlesen, da alles andere zu lange dauern würde. Du müsstest bei jedem Tastendruck (z.B. Bild ab) mitberechnen, welchen Teil der Datei Du laden musst. |
Re: Blockread oder Tfilestream was nu ???
hallo christian,
also das mmf torturial hab ich nich gefunden, aber ich hab mir was zum mmf im forum angeschaut, da graust mir's vor handle's, pointer's, api' exeption's abfragen ! eigentlich bin ich alter pascal hase, aber ist das neue schneller oder nur eine andere syntax ??? und wie ist das zum beispiel, wenn ich in einem filestream sagen wir mal byte 500 in der datei aendern will, muss ich da mit irgentwelchen memory pointern rummachen, die dann die bytes direkt im hauptspeicher aendern, und dann denn stream zurueckschreiben oder wie geht der technische vorgang ab ??? |
Re: Blockread oder Tfilestream was nu ???
Moin Richard,
Du kannst einfach mit Hilfe der Eigenschaft Position (Position = 0 => 1. Byte der Datei) den Anfang des zu ändernden Bereiches anwählen, und dann mit der Methode Write ab dieser Stelle schreiben. |
Re: Blockread oder Tfilestream was nu ???
hallo Christian,
ja, ja das ist mir schon klar, aber wenn ich das richtig seh, wird der komplette datenstream, in den hauptspeicher geschrieben, und wie will ich ihn dort veraendern, um ihn dann schreiben zu lassen, doch nicht etwa mit dem anspringen und aendern absoluter speicheradressen oder ? |
Re: Blockread oder Tfilestream was nu ???
Moin!
Wieso sollte ein TFileStream den kompletten Dateiinhalt in den Speicher laden? Völliger Müll - er öffnet die Datei, er liest die Anzahl von Bytes die du ihm sagst beim Lesen an die Stelle X, die du ihm sagst beim Lesen, und das wars. Die liest er dann direkt aus der Datei - er puffert nix zwischen - das musst du machen. Grundsätzlich sind aber BlockRead/TFileStream das gleiche, da sie auf den gleichen WinAPI Funktionen beruhen. Vorteil von TFileStream ist aber hingegen, dass dieser grössere Dateien verarbeiten kann, da bei der Definition von den alten Pascal Routinen noch der Variablentyp für die Position innerhalb der Datei zu klein war. Ab Delphi 6 haben die TStream Derivate sogar schon einen Int64 für die Dateigrösse und Filezeigerposition bekommen. MfG Muetze1 |
Re: Blockread oder Tfilestream was nu ???
hallo muetze
ja an welche stellen x den, and eine stelle im haupspeicher, oder an eine stelle in ein vorher definierten array, oder in eine bestimmte variable oder ein memoryhandle, verstehst du, mein problem is, das ich nich weis, wie ich an die eigelesenen daten rankomme um sie bearbeiten oder veraendern zu koennen. bei blockread mach ich das mit einen array, aber wie gehst bei tfilestream ???? :gruebel: |
Re: Blockread oder Tfilestream was nu ???
Na an stelle X in der datei (X=byte vom anfang der datei).
in etwa so:
Delphi-Quellcode:
oder spricht da was gegen?
var buffer:array[0..1023] od byte;
.. var fileStream : TFileStream; begin fileStream := TFileStream.Create(fileName, fmOpenCreate oder so); try fileStream.position := X; fileStream.readBuffer(buffer[0],sizeOf(buffer)); // buffer ändern buffer[42] := 42; // zurück damit fileStream.position := X; fileStream.writeBuffer(buffer[0],sizeOf(buffer)); finally fileStream.free; end; |
Re: Blockread oder Tfilestream was nu ???
Moin!
Die Stelle "X" kannst du doch selber festlegen. Du kannst ihm doch einfach eine Integervariable geben und 4 Bytes einlesen, dann hast du die 4 Bytes aus der Datei an Stelle X im Speicher, wobei X die Position des Integers ist. Genausogut kannst du einen Buffer verwenden wie maximov das gezeigt hat. Bei dir währe es doch das beste, wenn du dir einen Buffer anlegst nach dem Vorbild von maximov welcher so gross wie der darstellbare Ausschnitt in deiner HexView ist. Dann brauchst du beim Scrollen einfach immer nur zu der FilePosition gehen und die Grösse des Buffers einzulesen. Darstellen brauchst du immer nur den Inhalt des Buffers. Und im Speicher hast du dann auch immer nur den Buffer... MfG Muetze1 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:35 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