2012-06-02 13 views
11

Bir dosyaya ne zaman yapmak gerekiyor?
Bunu yapmam, çünkü File.Close'a çağrı yapıyorum ve bunun otomatik olarak temizlendiğini düşünüyorum, değil mi?Go bir dosya ne zaman temizlenir?

+0

Neden birisi bunu kapatmak istiyor? Bir yorum lütfen? –

+0

Bunu düşündüğünüz nedir .Close(), baytları otomatik olarak depoya akıtır? [Kapat için kaynak bunu göstermiyor gibi görünüyor] (https://golang.org/src/os/file_unix.go?s=5591:5619#L179) - Bir şey eksik miyim? –

cevap

12

Os.File öğesinin bir .Flush() olmadığı, çünkü arabelleğe alınmadığı için bir tanesine ihtiyaç duymadığını fark edersiniz. Yazmak için dosyaya yazmak için doğrudan syscalls yazıyor.

Programınız çıktığı zaman (kilitlense bile) açık olduğu tüm dosyalar işletim sistemi tarafından otomatik olarak kapatılır ve dosya sistemi değişiklik yaptığınızda diske yazılır (bazen birkaç dakika sonra) programınız çıkar.

os.File.Sync() çağrısı, dosya sistemini arabelleklerini diske akıtmaya zorlayacak fsync() syscall öğesini çağırır. Bu, sisteminiz kapalı veya işletim sistemi çökerse bile verilerinizin diskte ve kalıcı olduğunu garanti edecektir.

Sen .Sync aramaya gerek yok()

+1

Bu cevap, fsync'i "fflush" ile karıştırır. Engellenmemiş bir dosyanın _flush_ olması gerekmez. Bu, yazının diske bağlı olduğunu garanti ederseniz, _sync_ 'e ihtiyacınız olmadığı anlamına gelmez. Piotr Praszmo'nun cevabı daha iyi. –

0

Veri bütünlüğünü olabildiğince sağlamak istediğinizde. Örneğin, programınız dosya kapatılmadan önce çökerse ne olur?

10

Bkz. here. File.Sync(), fsync numaralı syscall'tır. Bu isimde daha fazlasını bulabilmelisiniz.

fsync'un fflush ile aynı olmadığını ve kapatılmadan önce yürütülmediğini unutmayın.

Genelde aramanıza gerek yoktur. Dosya, bir süre sonra ve bu süre içinde elektrik kesintisi olmaması durumunda yine de diske yazılacaktır.

+2

"Genelde aramanıza gerek yoktur" Yalnızca, herhangi birinin, herhangi bir zamanda güç kaynağınızı kesmeye karar verebileceği yerleşik aygıtta çalışmadığınızda doğrudur. – Joppe

+0

Sorun yalnızca yerleşik aygıtlarla sınırlı değil. Her zaman bir senkronize olmayan yazımların bir dosya sisteminin bellek içi arabelleği ile birlikte ölme riski vardır, ancak modern günlük dosya sistemlerinde bu pencere ufukta küçüktür. Bazı pil destekli donanımlar tutarlılığı daha da artırabilir. 'sync', programı temeldeki depolama alanının güncel olduğundan daha fazla haberdar etmenin yoludur. –