AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Daten an Datei anhängen

Ein Thema von svenwel.de · begonnen am 25. Mai 2005 · letzter Beitrag vom 26. Mai 2005
Antwort Antwort
Benutzerbild von svenwel.de
svenwel.de

Registriert seit: 8. Apr 2005
Ort: Neunkirchen
23 Beiträge
 
Delphi 7 Personal
 
#1

Daten an Datei anhängen

  Alt 25. Mai 2005, 19:42
Guten Abend ich hab ne Frage

Ich möchte gern Daten an eine Datei anhängen und danach wieder auslesen , das anhängen ist im prinzip nicht die schwierigkeit

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var FStream : TfileStream;
    Mstream : TMemoryStream;
begin
    opendialog1.Execute;
    Mstream := TMemoryStream.Create;
    FStream := TFileStream.Create(opendialog1.FileName,fmOpenReadWrite);
    // Ans Ende der Datei
    FStream.Seek(0,soFromEnd);
    // Daten in Mstream schreiben
    Memo1.Lines.SaveToStream(MStream);
    // Daten von MStream in FStream
    Mstream.SaveToStream(FStream);
    // Destruktor
    MStream.Free;
    Fstream.Free;
end;
Im Prinzip müsste ich mir die größe von MStream und FStream merken um die daten nachher wieder auslesen zu können. Ich müsste dann praktisch an das das ende der neuen datei seeken und vom Ende bis zu Position "Fsteam - Msteam" alles wieder auslesen, die frage ist jetzt, wie kann ich diese positionen speichern ?


MFG
Sven W.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: Daten an Datei anhängen

  Alt 25. Mai 2005, 19:46
Häng sie als Integer hinten dran.
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.105 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Daten an Datei anhängen

  Alt 25. Mai 2005, 19:47
Moin svenwel,

schreibe die Länge des angehängten Teils doch ganz an das Ende, dann kannst Du leicht berechnen, wo der angehängte Teil beginnt.
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
Benutzerbild von svenwel.de
svenwel.de

Registriert seit: 8. Apr 2005
Ort: Neunkirchen
23 Beiträge
 
Delphi 7 Personal
 
#4

Re: Daten an Datei anhängen

  Alt 25. Mai 2005, 20:09
Einfach in Form eines Strings ? also die größe des angehängten teils in die memo speichern und ans ende hinzufügen ?
Sven W.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: Daten an Datei anhängen

  Alt 25. Mai 2005, 21:08
Schreib die Daten ans Ende, dahinter die Länge und dann noch eine Kennung, das Daten angehängt wurden.
Delphi-Quellcode:
Function GetAppendixInfo (aFile : TString; Var aSize : Integer) : Boolean;
// Liefert True und die Länge des Anhängsels, oder False, wenn keins da ist.
Begin
  aFile.Seek (4, soFromEnd);
  aFile.ReadInteger (aValue);
  if aValue <> ccMyPostamble Then
    Result := False
  else begin
    Result := True;
    aFile.Seek (8, soFromEnd);
    aFile.ReadInteger (aSize);
    End
End;
    
Procedure AppendData (aFile, aData : TStream);
Begin
  If GetAppendixInfo (aFile, aSizeOfOldData) Then
    aFile.Seek (aSizeOfOldData, soFromEnd)
  Else
    aFile.Seek (0, soFromEnd);
  aFile.Copy (aData, aData.Size);
  aFile.WriteInteger (aData.Size + 8); // Daten + 2*Integer
  aFile.WriteInteger (ccMyPostamble);
  aFile.Truncate;
End;

Procedure ReadAppendix (aFile, aData : TStream);
Begin
  If not GetAppendixInfo (aFile, aSizeOfData) Then
    Raise Exception.Create ('Da is nix');
  aFile.Seek (aSizeOfData, soFromEnd); // aSizeOfData ist um 8 bytes grösser (wg Länge und postamble)
  aData.Copy (aFile, aSizeOfData - 8);
End;
Das ist Pseudocode, es kann also sein, das einige Methoden nicht existieren, aber der Sinn ist klar:
Wenn ich Daten hinten dran hänge, dann schreibe ich die Daten, dann die Länge, dann eine Kennung
Wenn ich Daten lesen will, dann gucke ich erst, ob hinten die Kennung dran ist. Wenn ja, lese ich die 4 bytes davor (die Länge) und dann die Daten.
Mit ein bisserl Gehirnschmalz kannst Du mehrere Blöcke hinten dran hängen.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von svenwel.de
svenwel.de

Registriert seit: 8. Apr 2005
Ort: Neunkirchen
23 Beiträge
 
Delphi 7 Personal
 
#6

Re: Daten an Datei anhängen

  Alt 25. Mai 2005, 22:24
Irgendwat mach ich falsch

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var FStream : TStream;
    Mstream : TMemoryStream;
    iMSize : integer;
begin
    Mstream := TMemoryStream.Create;
    opendialog1.Execute;
    FStream := TFileStream.Create(opendialog1.FileName,fmOpenReadWrite);

    FStream.Seek(0,soFromEnd);
  
    Memo1.Lines.SaveToStream(MStream);

    FStream.CopyFrom(MStream,0);
    iMSize := MStream.Size+sizeof(integer);
    Fstream.Write(iMSize,SizeOf(IMSize));

    

    MStream.Free;
    Fstream.Free;

end;

procedure TForm1.Button2Click(Sender: TObject);
var FStream : TStream;
    LStream : Tstream;
begin
   opendialog1.Execute;

   LStream := TStream.Create;

   FStream := TFileStream.Create(opendialog1.FileName,fmOpenReadWrite);
   FStream.Seek(sizeof(integer)+4,soFromEnd);
   LStream.CopyFrom(Fstream,SizeOf(Integer)-4);

   Memo2.Lines.LoadFromStream(LStream);

   LStream.Free;
   Fstream.Free;

end;
Also ich hab jetzt des gemacht, was in dem Pseudo Code steht
Sven W.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#7

Re: Daten an Datei anhängen

  Alt 26. Mai 2005, 06:50
Wenn es funktioniert, dann freut's mich. Aber ich würde mir die Mühe machen, eine Kennung hinten ranzuhängen, das wird sicherer.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
franktron

Registriert seit: 11. Nov 2003
Ort: Oldenburg
1.446 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#8

Re: Daten an Datei anhängen

  Alt 26. Mai 2005, 08:40
Das funktioniert nicht so
Fstream.Write(iMSize,SizeOf(IMSize)); Änder das so um dann sollte es gehen
Fstream.Write(iMSize,SizeOf(integer));
Frank
Tux sein Lieblingsquellcode
While anzfische<TuxSatt do begin
Fisch:=TFisch.Create; Tux.EssenFisch(Fisch); Fisch.Free;inc(anzfische); end;
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#9

Re: Daten an Datei anhängen

  Alt 26. Mai 2005, 10:43
Ich als professioneller kleiner Klugscheisser würde sagen, das Sizeof(IntegerVariable) = SizeOf (Integer), aber egal:
Ich hatte das Posting von svenwel.de nicht richtig gelesen.

Also sven: Was Du da geschrieben hast, stammt nicht von meinem Pseudocode.
Teil 1: Code zerreissen:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
// ***** TStream ist eine abstrakte Basisklasse. Nimm TFileStreams.
var FStream : TStream;
    Mstream : TMemoryStream;
    iMSize : integer;
begin
    Mstream := TMemoryStream.Create;
    opendialog1.Execute;
    FStream := TFileStream.Create(opendialog1.FileName,fmOpenReadWrite);

// *** Was ist, wenn hier schon was angehängt wurde ?
    FStream.Seek(0,soFromEnd);
 
    Memo1.Lines.SaveToStream(MStream);

    FStream.CopyFrom(MStream,0);
    iMSize := MStream.Size+sizeof(integer);
    Fstream.Write(iMSize,SizeOf(IMSize));

    MStream.Free;
    Fstream.Free;

end;

procedure TForm1.Button2Click(Sender: TObject);
var FStream : TStream;
    LStream : Tstream;
begin
   opendialog1.Execute;

   LStream := TStream.Create;

   FStream := TFileStream.Create(opendialog1.FileName,fmOpenReadWrite);

// **** Denkfehler, Du gehst ja nicht zum letzten DWORD, sondern zum VORLETZTEN!
// richtig sollte es heissen : FStream.Seek (SizeOf (Integer), soFromEnd);
   FStream.Seek(sizeof(integer)+4,soFromEnd);

// ***** Du musst doch erstmal die Datenlänge (iMSize) auslesen, das geht mit
// ***** FStream.Read (iMSize, SizeOf (Integer));
   LStream.CopyFrom(Fstream,SizeOf(Integer)-4);

// ***** Dann musst Du doch an den Anfang der Daten im FStream und DANN erst LStream einlesen, also:
// ***** FStream.Seek (iMSize, soFromEnd);
// ***** und dann iMSize-SizeOf (Integer) Bytes in LStream kopieren, also:
// ***** LStream.CopyFrom (FStream, iMSize - SizeOf (Integer));
   Memo2.Lines.LoadFromStream(LStream);

// ***** IMMER mit Try...Finally schützen...
   LStream.Free;
   Fstream.Free;

end;

Teil 2: Klugscheissen...
Also sieht der Code so aus:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
  FStream : TFileStream;
  LStream : TStringStream;
  iMSize : Integer;

begin
   opendialog1.Execute;
   LStream := TStringStream.Create('');
   Try
     FStream := TFileStream.Create(opendialog1.FileName,fmOpenReadWrite);
     Try
// Wieviel Bytes sind denn in der angehängten Nachricht? Gehe zum letzen DWORD im Stream.
// Der fängt 4 Bytes von hinten gezählt an (sonst wärs ja nicht der letzte Integer)
       FStream.Seek (SizeOf (Integer), soFromEnd);
       FStream.Read (iMSize, SizeOf (Integer));
// So, dann setzen wir uns auf den Anfang der Daten.
       FStream.Seek (iMSize, soFromEnd);

// Wir haben ja 'Länge + 4 Bytes' in iMSize reingeschrieben (siehe oben), also lesen wir
// auch genau die Bytes wieder raus.
       LStream.CopyFrom (FStream, iMSize - SizeOf (Integer));

// Ein TStringstream ist ein bisserl schneller, weil ich den gelesenen String nicht *nochmal*
// kopiere. Soweit ich weiss, arbeiten die Strings mit Referenzzählern...
       Memo2.Lines.Text := LStream.DataString;
    Finally
      FStream.Free;
      End;
  Finally
    LStream.Free;
    End;
end;
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Antwort Antwort


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 10:49 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