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 Blockread oder Tfilestream was nu ??? (https://www.delphipraxis.net/24940-blockread-oder-tfilestream-nu.html)

richard_boderich 28. Jun 2004 21:37


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

Uncle Cracker 28. Jun 2004 22:35

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:

Christian Seehase 28. Jun 2004 23:43

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. (Hier im Forum suchenMMF)

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.

richard_boderich 29. Jun 2004 00:10

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 ???

Christian Seehase 29. Jun 2004 00:14

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.

richard_boderich 29. Jun 2004 07:18

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 ?

Muetze1 29. Jun 2004 09:02

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

richard_boderich 29. Jun 2004 10:01

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:

maximov 29. Jun 2004 11:17

Re: Blockread oder Tfilestream was nu ???
 
Na an stelle X in der datei (X=byte vom anfang der datei).

in etwa so:
Delphi-Quellcode:
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;
oder spricht da was gegen?

Muetze1 29. Jun 2004 11:58

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.
Seite 1 von 2  1 2      

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