AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Streams: existierende Daten entfernen / einfügen

Streams: existierende Daten entfernen / einfügen

Offene Frage von "mytar"
Ein Thema von mytar · begonnen am 5. Aug 2004 · letzter Beitrag vom 29. Mär 2005
Antwort Antwort
Seite 2 von 2     12
Benutzerbild von Dani
Dani

Registriert seit: 19. Jan 2003
732 Beiträge
 
Turbo Delphi für Win32
 
#11

Re: [Streams]: existierende Daten entfernen / einfügen

  Alt 9. Mär 2005, 16:27
Zitat von Luckie:
Wenn du mitten reinschreiben willst, dann wird dir nichts anderes übrigbleiben, als ab der Stelle den Rest in einem memoryStream zwischenzuspeichern, deinen Datensatz reinschreiben und dann den gesicherten Rest wieder dranzuhängen.
Das ist nicht akzeptabel, ich kann doch nicht bei einem 100 MB großen Archiv mal eben 99,99 MB in den RAM auslagern, nur weil ich einen Kommentarstring im Header ändern will!? Gibt es denn gar keine andere Lösung?
Dani H.
At Least I Can Say I Tried
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#12

Re: [Streams]: existierende Daten entfernen / einfügen

  Alt 9. Mär 2005, 17:13
Hallo,
Zitat von Dani:
Zitat von Luckie:
Wenn du mitten reinschreiben willst, dann wird dir nichts anderes übrigbleiben, als ab der Stelle den Rest in einem memoryStream zwischenzuspeichern, deinen Datensatz reinschreiben und dann den gesicherten Rest wieder dranzuhängen.
Das ist nicht akzeptabel, ich kann doch nicht bei einem 100 MB großen Archiv mal eben 99,99 MB in den RAM auslagern, nur weil ich einen Kommentarstring im Header ändern will!? Gibt es denn gar keine andere Lösung?
bei komplexeren Formaten würde ich nicht den klassischen Stream verwenden, sondern würde über das IStorage Interface gehen. Mit diesem Interface kann man innerhalb einer Datei ein "Dateisystem" anlegen. Man kann sich wie den Windows-Explorer vorstellen.
Das IStorage Interface gibt es schon so lange, dass es sogar in der Win32 Referenz, die mit Delphi geliefert wird beschrieben wird. Mit ein bißchen COM Kenntnissen und googeln sollte es nicht all zu schwierig werden.
Eine Datei mit Header mit Datenteil würde dann intern so aussehen
Code:
Root
  |----Header
  |----Daten
Man kann dann nur in den Header schreiben (so viel man möchte). Der Datenteil bleibt davon unberührt.
I come from outer space to save the human race
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#13

Re: [Streams]: existierende Daten entfernen / einfügen

  Alt 9. Mär 2005, 17:19
Zitat von mytar:
Ich hab eine Datei, und öffne sie via Stream, nun möchte ich mit Seek() die entsprechende Position suchen, und dann was in den Stream einfügen, oder herauslöschen. Die Datei hab ich zuvor selbst erzeugt, ich kenne also die Dateistruktur.
Zitat von Luckie:
Wenn du mitten reinschreiben willst, dann wird dir nichts anderes übrigbleiben, als ab der Stelle den Rest in einem memoryStream zwischenzuspeichern, deinen Datensatz reinschreiben und dann den gesicherten Rest wieder dranzuhängen.
Was Lucky sagt, ist so korrekt und daran führt kein Weg vorbei.
Theoretisch könnte man alle 8kByte (die Clustergrösse) weitere Cluster einfügen oder löschen.
Praktisch kannst du eine Datei auf Festplattenebene nicht manipulieren ohne sehr viel Aufwand zu betreiben.

Alle Dateiformate für Datenbanken gehen nun so vor, dass ein Block oder Datensatz als gelöscht markiert wird und neue Daten ans Dateiende geschrieben werden.
Nach einige Zeit enthält die Datei Löcher und kann wesentlich mehr Platz auf der Platte brauchen, als Nutzdaten vorhanden sind.
Dann ist eine Komprimierung der Daten fällig. (Nutzdaten werden in neue Datei kopiert, alte Datei geöscht und Neu -> Alt umbenamst)

Also denk dir mal ein schlaues Datenformat aus. Eine Archivdatei könnte z.B. folgenden Aufbau haben:
Code:
Datensatzname: string(32);
Nutzdatensize: integer;
blocksize: integer;     // immer > oder = Nutzdatensize
Flags: Cardinal;       // 1=gelöscht
[nutzdaten.....][evtl. unbenutzte Daten]
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von Dani
Dani

Registriert seit: 19. Jan 2003
732 Beiträge
 
Turbo Delphi für Win32
 
#14

Re: [Streams]: existierende Daten entfernen / einfügen

  Alt 9. Mär 2005, 17:31
Dann werde ich mich mal in den Umgang mit dem IStorage Interface einarbeiten. Danke für den Tipp =)
Dani H.
At Least I Can Say I Tried
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#15

Re: [Streams]: existierende Daten entfernen / einfügen

  Alt 9. Mär 2005, 17:34
Moin!

Naja, ich würde trotzdem Luckies Aussage abwandeln und sagen, das man sich ein temporäres Stream Objekt anlegt. Dabei ist der Typ dann die Sache des Programmierers. Wenn ich weiss, das es ein 100 MB Archiv ist, dann würde ich in einem TFileStream das ganze zwischenspeichern bzw. darin neu zusammenbauen. Bei deutlich kleineren Datenmengen wäre ein TMemoryStream angebracht. Es ist wirklich nicht ein Glanzstück mal schnell den Speicher mit 100 MB voll zu stopfen, so dass Windows vielleicht noch anfängt auf kleineren Rechnern erstmal stundenlang auszulagern. Da wäre dann der direkte Weg auf die Festplatte effizienter.

MfG
Muetze1
  Mit Zitat antworten Zitat
mytar

Registriert seit: 30. Mai 2004
Ort: Zermatt
411 Beiträge
 
Delphi 6 Enterprise
 
#16

Re: Streams: existierende Daten entfernen / einfügen

  Alt 17. Mär 2005, 17:52
Ich denke diese IStorage-Interface ist eine gute Möglichkeit!

Wenns aber schnell umgeschrieben werden muss, ist eine temporäre Datei
auch sinnvoll.

Viele Compression-Tools machen es glaub ich auch auf diesem Weg!
Francis Obikwelu
greetz
mytar
  Mit Zitat antworten Zitat
mytar

Registriert seit: 30. Mai 2004
Ort: Zermatt
411 Beiträge
 
Delphi 6 Enterprise
 
#17

Re: [Streams]: existierende Daten entfernen / einfügen

  Alt 28. Mär 2005, 10:58
Zitat von shmia:
Alle Dateiformate für Datenbanken gehen nun so vor, dass ein Block oder Datensatz als gelöscht markiert wird und neue Daten ans Dateiende geschrieben werden.
Nach einige Zeit enthält die Datei Löcher und kann wesentlich mehr Platz auf der Platte brauchen, als Nutzdaten vorhanden sind.
Dann ist eine Komprimierung der Daten fällig. (Nutzdaten werden in neue Datei kopiert, alte Datei geöscht und Neu -> Alt umbenamst)
Nenn man so etwas die Datenbank reorganisieren?

Nur interesse halber?
Francis Obikwelu
greetz
mytar
  Mit Zitat antworten Zitat
mytar

Registriert seit: 30. Mai 2004
Ort: Zermatt
411 Beiträge
 
Delphi 6 Enterprise
 
#18

Re: Streams: existierende Daten entfernen / einfügen

  Alt 29. Mär 2005, 09:13
*push*
Francis Obikwelu
greetz
mytar
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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:11 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