AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Datei stückchenweise mit TFileStream einlesen
Thema durchsuchen
Ansicht
Themen-Optionen

Datei stückchenweise mit TFileStream einlesen

Ein Thema von Luckie · begonnen am 4. Okt 2003 · letzter Beitrag vom 4. Okt 2003
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

Datei stückchenweise mit TFileStream einlesen

  Alt 4. Okt 2003, 00:34
Ich versuche eien Datei stückchenweise mit ReadBuffer einzulesen, den Buffer zu verarbeiten und dann das Ganze wieder zu schreiben.
Delphi-Quellcode:
var
  SrcBuffer, DestBuffer: cardinal;
begin
  while SrcStream.Position < SrcStream.Size do
  begin
    SrcStream.ReadBuffer(SrcBuffer, 1024);
    EncodeBuffer(SrcBuffer, DestBuffer, 1024);
    DestStream.WriteBuffer(DestBuffer, 1024);
  end;
Aber das will nicht so recht. Ich bekomme da immer einen Stream.Lesefehler. Es hadelt sich um alle möglichen Dateien, binär, Text, typisierte, ...

So geht es auch nicht:
Delphi-Quellcode:
var
  SrcBuffer, DestBuffer: Pointer;
begin
  GetMem(SrcBuffer, 1024);
  GetMem(DestBuffer, 1024);
  while DestStream.Size < SrcStream.Size + sizeof(TFileHeader) do
  begin
    SrcStream.ReadBuffer(SrcBuffer, 1024);
    EncodeBuffer(SrcBuffer, DestBuffer, 1024);
    DestStream.WriteBuffer(DestBuffer, 1024);
  end;
Gleiche Fehler.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Kamil

Registriert seit: 17. Aug 2002
178 Beiträge
 
#2

Re: Datei stückchenweise mit TFileStream einlesen

  Alt 4. Okt 2003, 00:43
In eine cardinal Variable passen nur 32 Bit...
Nimm ein Array:
Code:
var
  SrcBuffer, DestBuffer: array[0..1023] of byte;
begin
  while SrcStream.Position < SrcStream.Size do
  begin
    SrcStream.ReadBuffer(SrcBuffer[0], 1024);
    EncodeBuffer(SrcBuffer[0], DestBuffer[0], 1024);
    DestStream.WriteBuffer(DestBuffer[0], 1024);
  end;
Du kannst auch mit pointer arbeiten:
Code:
SrcBuffer, DestBuffer: pointer;
begin
  getmem(SrcBuffer, 1024);
  getmem(DeasBuffer, 1024);
  try
    while SrcStream.Position < SrcStream.Size do
    begin
      SrcStream.ReadBuffer(SrcBuffer^, 1024);
      EncodeBuffer(SrcBuffer^, DestBuffer^, 1024);
      DestStream.WriteBuffer(DestBuffer^, 1024);
    end;
  finally
    freemem(SrcBuffer);
    freemem(DestBuffer);
  end;
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Datei stückchenweise mit TFileStream einlesen

  Alt 4. Okt 2003, 00:49
Ha, da war ich doch gar nicht soweit weg. Blos die Abbruchbedingung stimmt noch nicht ganz. Ich schreibe in den ZielStream erst einen Header und dann den QuellStream. Nur mit
while SrcStream.Position < SrcStream.Size do Bekomme ich zum Schluß wieder einen Stream-Lesefehler.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Kamil

Registriert seit: 17. Aug 2002
178 Beiträge
 
#4

Re: Datei stückchenweise mit TFileStream einlesen

  Alt 4. Okt 2003, 00:57
Code:
var
  Len: integer;
  ...
begin
...
  while SrcStream.Position < SrcStream.Size do
  begin
    Len:=(SrcStream.Size-SrcStream.Position) mod 1025;
    SrcStream.ReadBuffer(SrcBuffer^, Len);
    EncodeBuffer(SrcBuffer^, DestBuffer^, Len);
    DestStream.WriteBuffer(DestBuffer^, Len);
  end;
...
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Datei stückchenweise mit TFileStream einlesen

  Alt 4. Okt 2003, 01:03
Der Schuß ins Blaue ging daneben. Len ist immer 0. Er liest und schreibt also gar nichts.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Kamil

Registriert seit: 17. Aug 2002
178 Beiträge
 
#6

Re: Datei stückchenweise mit TFileStream einlesen

  Alt 4. Okt 2003, 01:10
Code:
if SrcStream.Size-SrcStream.Position>1024 then
  Len=1024
else
  Len:=SrcStream.Size-SrcStream.Position;
Bin schon ein wenig müde...
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Datei stückchenweise mit TFileStream einlesen

  Alt 4. Okt 2003, 01:14
Perfekt, der saß genau im Bulleseye. Besten Dank.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Kamil

Registriert seit: 17. Aug 2002
178 Beiträge
 
#8

Re: Datei stückchenweise mit TFileStream einlesen

  Alt 4. Okt 2003, 01:33
Da fällt mir noch ein:
Falls du statt ReadBuffer Read nimmst, dann kannst du es so machen:

Code:
var
  Len: integer;
  ...
begin
...
  while SrcStream.Position < SrcStream.Size do
  begin
    Len:=SrcStream.Read(SrcBuffer^, 1024);
    EncodeBuffer(SrcBuffer^, DestBuffer^, Len);
    DestStream.WriteBuffer(DestBuffer^, Len);
  end;
...
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#9

Re: Datei stückchenweise mit TFileStream einlesen

  Alt 4. Okt 2003, 03:49
Hm, Jetzt hab eich es so, aber die zweite Lösung wäre wohl performanter, da die if-Abfrage wegfällt. Und da waren sie wieder meine drei Problem... Stream-Lesefehler.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: Datei stückchenweise mit TFileStream einlesen

  Alt 4. Okt 2003, 04:00
Moin Luckie,

komisch.
An welcher Stelle denn?

Im Prinzip müsste es auch so gehen:

Delphi-Quellcode:
  iLen := fsIN.Read(sBuf[1],iBlockSize);
  while iLen > 0 do begin
    fsOUT.Write(sBuf[1],iLen);
    iLen := fsIN.Read(sBuf[1],iBlockSize);
  end;
Statt eines Strings wie bei mir kannst Du natürlich auch einen anderen Buffer (array of char) nehmen.
Lesefehler dürftest Du nur bei ReadBuffer bekommen, nicht bei Read.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  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 16:20 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