Wir benutzen eine der genannten Alternativen, nämlich simples Ersetzen der Dateien. Sprich wir schreiben in eine temporäre Datei und benennen diese dann am Ende in den richtigen Dateinamen um. Ich sehe auch sonst in dafür in Frage kommenden Projekten niemanden, der dafür diese Transaktionen benutzt.
Nun wäre die Frage wie ihr die Dateien umbenennt.
MoveFileEx /
MoveFile wäre zwar scheinbar richtig, aber nur scheinbar. Denn wenn das fehlschlägt, wird intern ne Kopie versucht. Und schwupp ist deine vermeintlich atomare Aktion nicht mehr atomar.
Das hier ist die einzige Methode wenn man sich an die
Win32-
API hält, wie man hier atomares Verhalten erreicht. Einzige Alternative dazu ist der Rückgriff auf die
NT Native API an deren Verfügbarkeit für Delphianer ich selbst vor vielen Jahren gearbeitet habe.
ReactOS versucht das Verhalten von Windows bestmöglich nachzuempfinden und
hier findest du die Implementierung von MoveFileExW ohne daß du WinDbg oder nen Disassembler bemühen müßtest. Speziell geht es um
diese Zeile.
Das einzige Delphi was ich noch installiert habe ist in einer abgewrackten alten XP VM und das ist ein Delphi 7. Jetzt weeß ick natürlich nich ob sich das geändert hat, aber mit
RenameFile in SysUtils.pas aus Delphi-7-Zeiten benutzt du auch MoveFile. Haste also auch den Hut auf ...
Ich nutze es nicht, ich kenne niemand, der es tut, aber:
bei dem Begriff "Transaction" zuckt es ja bei mir. Für mich ist das jedoch ein Datenbankbegriff. Darf man sich das unter Windows funktional ebenso vorstellen? Scheinbar nicht ganz, die
API Doku aus dem Link scheint mir jedenfalls schon inkonstitente Zustände zu beschreiben:
The file is deleted after the last transacted writer handle to the file is closed, provided that the transaction is still active. If a file has been marked for deletion and a transacted writer handle is still open after the transaction completes, the file will not be deleted.
Hmm, erstens: was anderes ist ein Dateisystem als eine Datenbank? Es ist eine domänenspezifische Datenbank, aber es ist eine Datenbank. Und bei der Registry (TxR) wärst du damit vielleicht auch ohne
diese Erklärung damit d'accord gegangen. TxR scheint übrigens im Gegensatz zu den Dateisystemfunktionen nach wie vor ein Ding zu sein.
Zweitens: mir scheint du mißverstehst wie das normale
DeleteFile funktioniert. DeleteFile löscht nicht etwa, wie der Name es suggeriert, die Datei. Stattdessen setzt diese Funktion - übrigens mit der gleichen Methode die ich oben schon erwähnte (SetFileInformationByHandle) - ein Flag. Wenn die Funktion zum Aufrufer zurückkehrt muß die Datei noch lange nicht gelöscht sein (in NTFS kann das durchaus mal ein paar Sekunden dauern, wenn das System gerade "zu tun" hat). Wer mehr wissen will, schaut sich
das hier an. Unter der Haube werkelt da NtSetInformationFile, welches Treiberentwicklern ein Begriff sein dürfte. SetFileInformationByHandle ist meines Wissens für die unterstützten Klassen eine 1:1-Abbildung der darunterliegenden NT Native
API.
Kurzum DeleteFile ist ebensowenig atomar wie MoveFileEx. Hammer, oder?
Und "schlimmer" noch, bei näherer Betrachtung ist die vermeintliche Inkonsistenz nicht so inkonsistent wie du meinst. Transaktionen geben ja Garantien. Wenn nun also eine Datei, bspw. durch einen anderen Prozeß, zum Löschen vorgemerkt wird, dann
(Ach ja, intern benutzt MoveFile MoveFileEx, also falls hier jemand mitliest und MoveFile benutzt und sich in Sicherheit wog, dem kann ich diesen Zahn umgehend ziehen
... siehe oben)
Vielleicht ist es auch noch zu früh für mich, aber der Grund der Abschaffung könnte ja auch ein Designproblem/ Fehlkonstruktion sein.
Jain. Aber ReFS unterstützt keine Transaktionen, somit sind sie allein auf NTFS beschränkt. Wenn man das als Fehlkonstruktion von ReFS sehen will, dann wäre das halt eine mögliche Sichtweise.
Ich denke die sind allerdings nicht erst seit Windows 8 deprecated.
Quellen? Da es mit Windows Vista eingeführt wurde, bliebe dazwischen ja nur Windows 7.
Und dass Microsoft etwas strongly recommended sehe ich auch nicht oft.
Dann mußt du mehr Doku lesen
Bei der Geschwindigkeit wie sich Windows in den letzten Jahren ändert würde ich mich auch nie im Leben darauf verlassen dass so etwas noch lange verfügbar bleibt.
Das ist nun auch wieder wahr, jupp.
Okay, also bisher keiner der es benutzt. Alles klar. Danke für die Rückmeldungen!