AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi MemoryStream in Filestream sichern - Datenschrott !?
Thema durchsuchen
Ansicht
Themen-Optionen

MemoryStream in Filestream sichern - Datenschrott !?

Ein Thema von moelski · begonnen am 26. Sep 2007 · letzter Beitrag vom 26. Sep 2007
Antwort Antwort
Seite 1 von 3  1 23      
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#1

MemoryStream in Filestream sichern - Datenschrott !?

  Alt 26. Sep 2007, 10:13
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 ?
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
blackdrake

Registriert seit: 22. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#2

Re: MemoryStream in Filestream sichern - Datenschrott !?

  Alt 26. Sep 2007, 10:17
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
Daniel Marschall
  Mit Zitat antworten Zitat
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#3

Re: MemoryStream in Filestream sichern - Datenschrott !?

  Alt 26. Sep 2007, 10:22
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
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
s-off
(Gast)

n/a Beiträge
 
#4

Re: MemoryStream in Filestream sichern - Datenschrott !?

  Alt 26. Sep 2007, 10:27
Hallo,
Zitat von moelski:
Da kriege ich einen Stream Lesefehler
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;
  Mit Zitat antworten Zitat
Benutzerbild von TeronG
TeronG

Registriert seit: 19. Jul 2004
Ort: München
960 Beiträge
 
Delphi 2007 Professional
 
#5

Re: MemoryStream in Filestream sichern - Datenschrott !?

  Alt 26. Sep 2007, 10:29
Was spricht eigentlich gegen
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;
龍 Der Unterschied zwischen Theorie und Praxis ist in der Praxis größer als in der Theorie.
  Mit Zitat antworten Zitat
blackdrake

Registriert seit: 22. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#6

Re: MemoryStream in Filestream sichern - Datenschrott !?

  Alt 26. Sep 2007, 10:31
Hallo.

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

Gruß
blackdrake
Daniel Marschall
  Mit Zitat antworten Zitat
Benutzerbild von wicht
wicht

Registriert seit: 15. Jan 2006
Ort: Das schöne Enger nahe Bielefeld
809 Beiträge
 
Delphi XE Professional
 
#7

Re: MemoryStream in Filestream sichern - Datenschrott !?

  Alt 26. Sep 2007, 10:33
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.
http://streamwriter.org

"I make hits. Not the public. I tell the DJ’s what to play. Understand?"
  Mit Zitat antworten Zitat
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#8

Re: MemoryStream in Filestream sichern - Datenschrott !?

  Alt 26. Sep 2007, 10:34
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 !
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#9

Re: MemoryStream in Filestream sichern - Datenschrott !?

  Alt 26. Sep 2007, 10:34
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
  Mit Zitat antworten Zitat
s-off
(Gast)

n/a Beiträge
 
#10

Re: MemoryStream in Filestream sichern - Datenschrott !?

  Alt 26. Sep 2007, 10:35
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

Edit: ah, schon selber gemerkt
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 18:28 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