Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi MemoryStream in Filestream sichern - Datenschrott !? (https://www.delphipraxis.net/100317-memorystream-filestream-sichern-datenschrott.html)

moelski 26. Sep 2007 09:13


MemoryStream in Filestream sichern - Datenschrott !?
 
Moin !

Ich habe folgende Procedure:

Delphi-Quellcode:
procedure TForm10.dxBarButton6Click(Sender: TObject);
var fs: TFileStream;
    ms: TMemoryStream;
begin
  ms := TMemoryStream.Create;                    // Memory Stream für Objekt erzeugen
  fs := TFileStream.Create('test.dat',fmCreate); // Filestream erzeugen in dem alles abgelegt wird

  aqDockingManager1.SaveToStream(ms);            // aqDockingManager1 - Daten in dem Stream ablegen

  fs.WriteBuffer(ms, ms.Size);                    // aqDockingManager1 abspeichern

  fs.Free;
  ms.Free;
end;
Wenn ich das debugge dann kann ich feststellen das im MemoryStream MS alles sauber drin steht. Nämlich die Infos von DockingManager1. Wenn ich mir dann aber die Datei ansehe die durch TFileStream erzeugt wird, dann steht da was gänzlich anderes drin - nur Datenschrott.
Und ein Einlesen klappt dann logischerweise auch nicht mehr.

Kann mir jemand sagen wo mein Fehler liegt ? Warum wird der MemoryStream nicht sauber weggeschrieben ? :gruebel:

blackdrake 26. Sep 2007 09:17

Re: MemoryStream in Filestream sichern - Datenschrott !?
 
Hallo.

Write(a,b) oder WriteBuffera(a,b) verwendest du, wenn du den zu lesenden Inhalt der Länge b Bytes in Variable a speichern willst. "a" kann dann z.B. ein Integer sein. Strings muss man jedoch a[1] nennen. Aber in die MemoryStream-Variable kannst du nicht speichern!

Du kannst Inhalte von Streams mit "CopyFrom" rüberkopieren.

PS: Bitte Ressourcenschutzblöcke verwenden!

Delphi-Quellcode:
xyz := TStream.Create();
try
  // xyz...
finally
  xyz.free;
end;
Gruß
blackdrake

moelski 26. Sep 2007 09:22

Re: MemoryStream in Filestream sichern - Datenschrott !?
 
Moin !

Hmm, ich glaub ich steh auf der Leitung. Aber so tuts auch ned :

Delphi-Quellcode:
procedure TForm10.dxBarButton6Click(Sender: TObject);
var fs: TFileStream;
    ms: TMemoryStream;
begin
  ms := TMemoryStream.Create;                    // Memory Stream für Objekt erzeugen
  fs := TFileStream.Create('test.dat',fmCreate); // Filestream erzeugen in dem alles abgelegt wird

  aqDockingManager1.SaveToStream(ms);            // aqDockingManager1 - Daten in dem Stream ablegen

  fs.CopyFrom(ms, ms.Size);                    // aqDockingManager1 abspeichern

  fs.Free;
  ms.Free;
end;
Da kriege ich einen Stream Lesefehler :freak:

s-off 26. Sep 2007 09:27

Re: MemoryStream in Filestream sichern - Datenschrott !?
 
Hallo,
Zitat:

Zitat von moelski
Da kriege ich einen Stream Lesefehler

Zitat:

Zitat von blackdrake
Aber in die MemoryStream-Variable kannst du nicht speichern!

Delphi-Quellcode:
Procedure TForm1.Button1Click(Sender: TObject);
Var
   fs: TFileStream;
   ms: TMemoryStream;
Begin
   ms := TMemoryStream.Create;
   ms.LoadFromFile('C:\Download\Source.txt');
   fs := TFileStream.Create('C:\Download\Dest.txt', fmOpenReadWrite);
   fs.CopyFrom(ms, ms.Size);
   fs.Free;
   ms.Free;
End;

TeronG 26. Sep 2007 09:29

Re: MemoryStream in Filestream sichern - Datenschrott !?
 
Was spricht eigentlich gegen
Delphi-Quellcode:
ms.SaveToFile('filename');

also dann so in etwa:

Delphi-Quellcode:
procedure TForm10.dxBarButton6Click(Sender: TObject);
var    
  ms: TMemoryStream;
begin
  ms := TMemoryStream.Create;                    // Memory Stream für Objekt erzeugen
  try
    aqDockingManager1.SaveToStream(ms);          // aqDockingManager1 - Daten in dem Stream ablegen

    ms.SaveToFile('test.dat');                   // aqDockingManager1 abspeichern
  finally
    ms.Free;
  end;
end;

blackdrake 26. Sep 2007 09:31

Re: MemoryStream in Filestream sichern - Datenschrott !?
 
Hallo.

Unter Umständen musst du zwischen "SaveToStream" und "CopyFrom" die Position wieder auf 0 setzen.

Gruß
blackdrake

wicht 26. Sep 2007 09:33

Re: MemoryStream in Filestream sichern - Datenschrott !?
 
Eventuell musst du die Position des Streams vor CopyFrom() auch noch passend mit Seek() oder Position setzen.

Roter Kasten: Man, warum bin ich immer so spät...

Zitat:

If Count is 0, CopyFrom sets Source position to 0 before reading and then copies the entire contents of Source into the stream. If Count is greater than or less than 0, CopyFrom reads from the current position in Source.

moelski 26. Sep 2007 09:34

Re: MemoryStream in Filestream sichern - Datenschrott !?
 
Moin !

So gehts:
Delphi-Quellcode:
procedure TForm10.dxBarButton7Click(Sender: TObject);
Var
   fs: TFileStream;
   ms: TMemoryStream;
Begin
   ms := TMemoryStream.Create;
   //ms.LoadFromFile('E:\Documents and Settings\Administrator\My Documents\RAD Studio\Projekte\Unit1.pas');
   aqDockingManager1.SaveToStream(ms);
   fs := TFileStream.Create('ZTest.txt', fmCreate);
   ms.Position := 0;
   fs.CopyFrom(ms, ms.Size);
   fs.Free;
   ms.Free;
End;
Zitat:

Unter Umständen musst du nach "SaveToStream" die Position wieder auf 0 setzen.
Das war der Hinweis im Zusammenhang mit CopyFrom.

Nu rennt das ! Danke !

negaH 26. Sep 2007 09:34

Re: MemoryStream in Filestream sichern - Datenschrott !?
 
typischer Anfängerfehler.

Delphi-Quellcode:
aqDockingManager1.SaveToStream(ms);            // aqDockingManager1 - Daten in dem Stream ablegen
ms.position := 0;
fs.CopyFrom(ms, ms.Size);                    // aqDockingManager1 abspeichern
Wenn du irgendwas aus einem Stream liest oder schreibst, was passiert mit Stream.Position ?
Und wenn nun der Zielstream -> ms -> leer ist un man schreibt 1000 Bytes da hinein, wo steht ms.Position ? (Tipp .Positon = .Size)
Wenn du dann aus Stream -> ms lesen möchtest und .Positon = .Size, wieviele Bytes kann man dann daraus lesen ?

Diese Fragestellung kam schon oft in der DP vor.

Gruß Hagen

s-off 26. Sep 2007 09:35

Re: MemoryStream in Filestream sichern - Datenschrott !?
 
Zitat:

Zitat von wicht
Zitat:

If Count is 0, CopyFrom sets Source position to 0 before reading and then copies the entire contents of Source into the stream. If Count is greater than or less than 0, CopyFrom reads from the current position in Source.

Zitate aus der Hilfe bitte mit Quote-Tags versehen - ich dachte gerade schon die Delphi-Tags wären defekt :wink:

Edit: ah, schon selber gemerkt :-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:18 Uhr.
Seite 1 von 3  1 23      

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