2012-06-02 15 views
11

Quando è necessario fare in un file?
Non lo faccio mai perché chiamo su File.Close, e penso che sia scaricato automaticamente, non è vero?Quando svuotare un file in Go?

+0

Perché qualcuno voleva chiudere questo? Un commento per favore? –

+0

Cosa ti fa pensare che .Close() scarica automaticamente i byte nello spazio di archiviazione? [La fonte per Chiudi non sembra indicare questo] (https://golang.org/src/os/file_unix.go?s=5591:5619#L179) - mi manca qualcosa? –

risposta

12

Si noterà che un file OS non ha un file .Flush() perché non ne ha bisogno perché non è memorizzato nel buffer. Le scritture sono dirette alle syscalls per scrivere sul file.

Quando il programma termina (anche se si blocca) tutti i file che ha aperto verranno chiusi automaticamente dal sistema operativo e il file system scriverà le modifiche sul disco quando ci sarà intorno (a volte fino a pochi minuti dopo il tuo programma esce).

Chiamare os.File.Sync() chiamerà il syscall di fsync() che costringerà il file system a svuotare i suoi buffer sul disco. Ciò garantirà che i tuoi dati siano su disco e persistenti anche se il sistema viene spento o il sistema operativo si interrompe.

Non è necessario chiamare .sync()

+1

Questa risposta confonde 'fsync' con' fflush'. Non è necessario _flush_ un file non bufferizzato. Ciò non significa che non è necessario _sync_ it se si vuole garantire che la scrittura sia stata commessa su disco. La risposta di Piotr Praszmo è migliore. –

0

Quando si desidera garantire l'integrità dei dati il ​​più possibile. Ad esempio, cosa succede se il tuo programma si blocca prima di chiudere il file?

10

Vedere here. File.Sync() è syscall a fsync. Dovresti riuscire a trovare altro sotto quel nome.

Ricordare che fsync non corrisponde a fflush e non viene eseguito prima della chiusura.

Generalmente non è necessario chiamarlo. Il file verrà comunque scritto sul disco, dopo un po 'di tempo e se non ci sono interruzioni di corrente durante questo periodo.

+2

"Generalmente non è necessario chiamarlo" Che è vero solo se non si sta lavorando su un dispositivo incorporato dove qualcuno può decidere di disconnettere l'alimentazione in qualsiasi momento. – Joppe

+0

Il problema non è limitato ai soli dispositivi integrati. C'è sempre il rischio che le scritture non sincronizzate muoiano insieme al buffer in memoria di un filesystem, ma con i moderni filesystem registrati su giornale, quella finestra è estremamente piccola. Alcuni hardware con batteria tampone possono migliorare ulteriormente la coerenza. 'sync' è il modo per rendere il programma più consapevole del fatto che lo storage sottostante è aggiornato. –