Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Sicheres Speichern (https://www.delphipraxis.net/154605-sicheres-speichern.html)

blablab 17. Sep 2010 12:32

Sicheres Speichern
 
Hallo!

Ich hab ein Programm geschrieben das mit einem Timer alle paar Minuten die Daten speichert. Das hab ich extra so gemacht, dass bei einem Absturz die neuen Daten nicht verloren gehen.
Jetzt ist mein PC abgestürzt und durch einen "glücklichen" Zufall ist er genau beim Speichervorgang abgestürzt und nun sind meine Daten nicht veraltet sondern komplett kaputt...

Deshalb wollte ich fragen, wie ich meine Daten so speichern kann, damit sowas nicht mehr vorkommt.
Ich hab mir überlegt ich könnte die neue Datei unter einem anderen Namen speichern, dann die alte Datei löschen und die neue Datei umbenennen.
Ist das sinnvoll, oder gibts da vielleicht noch eine bessere Möglichkeit?

Was mich aber auch interessieren würde ist: Wie kann das überhaupt passieren? Das wundert mich echt.
1) Wie groß ist die Wahrscheinlichkeit dass der PC genau während dem Speichern abstürzt???
[Edit]Ca. 1:3000. Nicht mal so klein, das Speichern dauert anscheinend ziemlich lange...[/Edit]
2) Ich dachte NTFS hat Mechanismen (Journaling?) die sowas verhindern...

Grüße
Blablab

Satty67 17. Sep 2010 12:47

AW: Sicheres Speichern
 
Ich würde es so machen:

1) evtl. vorhandene <dateiname>.bak löschen (wenn 2) vorhanden)
2) momentane Datendatei in <dateiname>.bak umbenennen
3) Daten in <dateiname>.<ext> schreiben

So sollte zumindest mit ziemlich hoher Wahrscheinlichkeit immer eine *.bak Kopie existieren. Wenn es ganz wichtig ist, kann man hinterher auch noch eine Art verify drüber laufen lassen.

SirThornberry 17. Sep 2010 15:04

AW: Sicheres Speichern
 
Wenn es immer die gleiche Datei ist und der Nutzer keinen Dateinamen bestimmen kann/muss (also zum Beispiel einfach eine programminterne Information) so kann man auch eine Datei nehmen in der man 2 Stände hält. Der Aufbau sieht dann in etwa wie folgt aus
- aktiver Speicherstandindex (-1, 0 oder 1)
- Speicherstand1
- Speicherstand2

Beim speichern wird zuerst geschaut welches der aktuelle Speicherstand ist. Entsprechend wird der neue Stand dann auf den anderen Speicherstand geschrieben. Erst wenn dies erfolgreich geschehen ist wird die Information, welcher Speicherstand der aktive(neueste) ist geändert.

Reinhard Kern 17. Sep 2010 15:47

AW: Sicheres Speichern
 
Zitat:

Zitat von blablab (Beitrag 1050269)
2) Ich dachte NTFS hat Mechanismen (Journaling?) die sowas verhindern...

Hallo,

damit kenne ich mich auch nicht näher aus, habe aber gefunden:

A Change Journal can be disabled on a given volume, preventing the system from logging file and directory changes. By default, an NTFS volume will have its Change Journal disabled. Some application must explicitly activate the journal. Also note that any application can activate or disable the volume's journal at any time.

Hört sich für mich nicht nach einer besonders sinnvollen Einrichtung an, aber so sprach Microsoft.

Gruss Reinhard

Namenloser 17. Sep 2010 16:44

AW: Sicheres Speichern
 
Du könntest dir mal Transactions unter NTFS anschauen. Ist jedoch afaik erst ab Vista verfügbar.

Sir Rufo 17. Sep 2010 17:25

AW: Sicheres Speichern
 
ich würde das so machen:

1. aktuelle Daten in die Datei <Name>.tmp speichern
2. alte Daten von <Name>.dat nach <Name>.bak umbenennen
3. aktuelle Datei von <Name>.tmp nach <Name>.dat umbenennen
4. Datei <Name>.bak löschen

p80286 17. Sep 2010 17:45

AW: Sicheres Speichern
 
Es kommt darauf an wie viel Sicherheit Du brauchst.
Im Zweifel würde ich Generationen anlegen also etwa so etwas:
Code:
Datei.ext.G001
Datei.ext.G002
Datei.Ext.G003

usw.
hinterher kann man die Dateien löschen deren Inhalt mehrfach vorhanden ist.

Was den Absturz Deines Rechners angeht, wenn er nicht an einer USV hängt,dann reicht manchmal eine Störung im Stromnetz und es knallt.

Gruß
K-H

blablab 18. Sep 2010 14:37

AW: Sicheres Speichern
 
Vielen Dank für die vielen Antworten!

@NamenLozer
Ich hab auch gelesen dass es erst ab Vista geht und ich hab "leider" kein Vista, sondern XP.

@p80286
So hatte ich es sogar schonmal, allerdings gab das irgendwann ein Chaos als ich dann über 100 Dateien hatte (weil ich automatisch alle paar Minuten speichere). Und wenn man nicht sofort mitbekommt, dass die Daten falsch sind musste man alle Dateien durchgehen und versuchen rauszufinden, welches die letzte gültige Datei ist. Und das ist teilweise nichtmal so leicht.

@SirThornberry
Das ist auch ne gute Idee. Leider sind aber meine Dateien unterschiedlich groß und dann erfüllt das nicht mehr so ganz seinen Zweck.

@Reinhard Kern
Ich glaub ich hab da was verwechselt. Wenn ich das jetzt richtig verstanden habe dann ist das "normale" Journaling nur für Operationen auf dem Dateisystem zuständig und nicht für das Schreiben von Daten in einer Datei. Dass es dafür extra noch ein Change Jounaling gibt habe ich nicht gewusst.

@Rest
Dann bleibt mir im Prinzip ja nurnoch die Idee mit den 2 Dateien. So werd ichs dann auch machen. Wie genau ich die jetzt benenne und in welcher Reihenfolge ich das mache überleg ich mir noch, aber das ist ja jetzt nicht so entscheidend...

Nochmal Danke!

Grüße
Blablab

[OT]@Satty67
Du lernst weil du beim Lernen mehr lernst als du später wieder vergisst :P[/OT]


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:48 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz