Atomic Write

Code-Stücke können hier veröffentlicht werden.
Antworten
Benutzeravatar
name
User
Beiträge: 254
Registriert: Dienstag 5. September 2006, 16:35
Wohnort: Wien
Kontaktdaten:

Habe mir einen kleinen Context-Manager gebastelt um atomisch in Dateien zu schreiben. Er erstellt eine temporäre Datei, welche dann, sobald das Schreiben vollständig ist, auf den Platz der eigentlichen Datei renamed wird. Es wird zudem versucht, auch unter Windows (entsprechend der Möglichkeiten, die die jeweilige Windows- und Python-Version anbietet), atomisch zu sein.

Zu finden ist der unter der X11-Lizenz stehende Code unter http://github.com/segfaulthunter/sandbo ... icwrite.py und ich würde mich über Kommentare freuen.
Ohloh | Mein Blog | Jabber: segfaulthunter@swissjabber.eu | asynchia – asynchrone Netzwerkbibliothek

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.
lunar

Bist Du sicher, dass diese Art, "a" zu simulieren, funktioniert? Die Kopie erfolgt ja nach dem Öffnen der temporären Datei, und ich glaube nicht, dass ein geöffneter Dateideskriptor nachträgliche Änderungen an der darunter liegenden Datei so ohne Weiteres übernimmt.

Ach ja, gibt es einen speziellen Grund, warum Du __init__ nicht NamedTemporaryFile verwendest, und warum Du in __exit__ explizit ".flush()" aufrufst?
Benutzeravatar
name
User
Beiträge: 254
Registriert: Dienstag 5. September 2006, 16:35
Wohnort: Wien
Kontaktdaten:

lunar hat geschrieben:Bist Du sicher, dass diese Art, "a" zu simulieren, funktioniert? Die Kopie erfolgt ja nach dem Öffnen der temporären Datei, und ich glaube nicht, dass ein geöffneter Dateideskriptor nachträgliche Änderungen an der darunter liegenden Datei so ohne Weiteres übernimmt.

Ach ja, gibt es einen speziellen Grund, warum Du __init__ nicht NamedTemporaryFile verwendest, und warum Du in __exit__ explizit ".flush()" aufrufst?
Die Simulation von 'a' funktioniert, ja, zumindest unter Unix. Und NamedTemporaryFile hat in 2.5 kein delete Attribut, deshalb mach ich das manuell. Werde das mit 'a' später unter Windows testen, im Notfall eben zum Dateiende seeken.
Ohloh | Mein Blog | Jabber: segfaulthunter@swissjabber.eu | asynchia – asynchrone Netzwerkbibliothek

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.
lunar

@name: Danke für die (zu) schnelle Antwort. Die Frage nach der Simulation von "a" wollte ich eigentlich gerade wieder entfernen ...
BlackJack

Boah dieses Denglisch ist ja furchtbar. "atomic" heisst auf Deutsch "atomar" und statt "renamed" darf man ruhig "umbenannt" schreiben.
Benutzeravatar
name
User
Beiträge: 254
Registriert: Dienstag 5. September 2006, 16:35
Wohnort: Wien
Kontaktdaten:

BlackJack hat geschrieben:Boah dieses Denglisch ist ja furchtbar. "atomic" heisst auf Deutsch "atomar" und statt "renamed" darf man ruhig "umbenannt" schreiben.
Naja, umbenannt impliziert nicht mehr, dass `rename` benutzt wird, und atomisch existiert: „ato|misch <Adj.>: (schweiz.) atomar: das -e Potenzial.”

Aber ich denke, diese Meta-Diskussion hier weiter auszuführen, würde das Thema des Beitrages um weites verfehlen.
Ohloh | Mein Blog | Jabber: segfaulthunter@swissjabber.eu | asynchia – asynchrone Netzwerkbibliothek

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.
lunar

@name: Was, wenn nicht rename(), sollte denn sonst zum Umbenennen benutzt werden? Davon abgesehen ist es doch eigentlich vollkommen egal, wie der Quelltext funktioniert, solange er korrekt funktioniert ... das ist ja der Sinn der Wiederverwendung von Quelltext.
Antworten