Konuyu Açan
#1
Bir JSON ayar dosyasını doğrudan açıp üzerine yazmak kolay; ama süreç yazma ortasında çökerse dosya yarım kalabilir. Ben bu yüzden önce aynı dizinde geçici dosya oluşturup, yazma tamamlanınca os.replace ile hedefin yerine koymayı tercih ediyorum:
Buradaki önemli ayrıntı, geçici dosyanın hedefle aynı dizinde oluşturulması: böylece genellikle aynı dosya sistemi üzerinde kalır ve değiştirme işlemi atomik olur; okuyucu ya eski dosyayı ya da yenisini görür, yarım yazılmış ara hâli değil. Ayrıca dosyayı kapattıktan sonra değiştirmek Windows’ta açık dosya kaynaklı sorunlardan kaçınmaya yardımcı olur.
Ama “atomik” demek, her tür çökme veya elektrik kesintisine karşı tam dayanıklılık demek değil. fsync dosya içeriğini diske itmeye yardımcı olur; bazı sistemlerde dizin girdisinin de kalıcılaşması için dizinin ayrıca eşzamanlanması gerekir. Taşınabilir uygulamalarda bu ayrıntı işletim sistemine göre değişiyor.
Siz küçük yapılandırma dosyalarında bu yöntemi kullanıyor musunuz, yoksa daha basit doğrudan yazma yaklaşımını yeterince güvenli buluyor musunuz?
KOD
1234567891011121314151617
import json
import os
import tempfile
from pathlib import Path
hedef = Path("ayarlar.json")
with tempfile.NamedTemporaryFile(
mode="w", encoding="utf-8", dir=hedef.parent, delete=False
) as dosya:
gecici = Path(dosya.name)
json.dump(ayarlar, dosya, ensure_ascii=False, indent=2)
dosya.flush()
os.fsync(dosya.fileno())
os.replace(gecici, hedef)
Buradaki önemli ayrıntı, geçici dosyanın hedefle aynı dizinde oluşturulması: böylece genellikle aynı dosya sistemi üzerinde kalır ve değiştirme işlemi atomik olur; okuyucu ya eski dosyayı ya da yenisini görür, yarım yazılmış ara hâli değil. Ayrıca dosyayı kapattıktan sonra değiştirmek Windows’ta açık dosya kaynaklı sorunlardan kaçınmaya yardımcı olur.
Ama “atomik” demek, her tür çökme veya elektrik kesintisine karşı tam dayanıklılık demek değil. fsync dosya içeriğini diske itmeye yardımcı olur; bazı sistemlerde dizin girdisinin de kalıcılaşması için dizinin ayrıca eşzamanlanması gerekir. Taşınabilir uygulamalarda bu ayrıntı işletim sistemine göre değişiyor.
Siz küçük yapılandırma dosyalarında bu yöntemi kullanıyor musunuz, yoksa daha basit doğrudan yazma yaklaşımını yeterince güvenli buluyor musunuz?