2010-04-24 15 views

risposta

49

Atomico in generale significa che l'operazione non può essere interrotta completata o senza effetto. Quando si scrivono i file, ciò avviene scrivendo su un file temporaneo, quindi sostituendo l'originale con il temporaneo al termine della scrittura.

Un arresto anomalo durante la scrittura di un file atomico indica che l'originale non è stato modificato e che è possibile eliminare un file inutile. Un arresto anomalo durante la scrittura normalmente significherebbe che un file buono atteso è corrotto.

Per quanto riguarda le prestazioni, il costo è minimo. Durante la scrittura avrai due copie di un file. La sostituzione del file è un'operazione molto semplice a livello di file system.

Edit: grazie zneak

+6

Atomico significa piuttosto che l'operazione si verifica per intero o per nulla. Può essere interrotto, fermato o riavviato, semplicemente non modificherà lo stato del sistema finché non sarà completo. Tuttavia, la conclusione rimane la stessa. – zneak

+0

Non direi questo come "avremo due copie di un file" poiché è troppo facile da leggere che nel senso significa due copie degli stessi identici dati, che non è ciò che sta accadendo. –

0

file system non c'è bisogno di ricorrere a scrivere/rinominare cicli in scrittura atomiche. I file system con semantica di blocco consentono di "bloccare" porzioni o tutti i file, o in alcuni casi anche di fare cose come appendi a un file, per aiutare con l'atomicità.

@Randy, è probabile che entrambe le ipotesi sulla frammentazione siano errate. Sulla maggior parte dei filesystem, scrivere un intero file e chiuderlo comporterà un file meno frammentato, e scrivere un file di grandi dimensioni in una singola scrittura porterà sicuramente a un migliore utilizzo dei grandi blocchi. Se intendevi che i blocchi di file erano più propensi a "strisciare" attraverso il disco, ciò dipende dalle preferenze di layout nel tuo filesystem. Se stai scrivendo in flash, probabilmente vorrai che il filesystem si insinui nello storage disponibile come una sorta di autolivellamento delle scritture.

0

La scrittura richiede più passaggi, inoltre viene creato un file ausiliario. NSString Classe Reference spiega:

Se SI, il ricevitore viene scritto un file ausiliario, e quindi il file ausiliario viene rinominato al percorso. Se NO, il ricevitore è scritto direttamente sul percorso. L'opzione SÌ garantisce che il percorso, se esistente a , non verrà danneggiato anche se il sistema dovesse bloccarsi durante la scrittura di .

Ecco l'esempio nel caso di plists:

[array writeToFile:path atomically:YES]; 

quando "SI", allora plist viene aggiornato solo una volta, anche se si esegue il codice più volte in XCode,

[array writeToFile:path atomically:NO]; 

quando "NO" viene aggiornato fino a quando si esegue lo stesso codice (aggiornamento ripetuto).

+0

non hanno idea del motivo per cui alcune persone hanno downvoted la risposta senza alcuna spiegazione. –

+1

Penso perché ritengono che non si debba fare affidamento sulle complessità non documentate di un'API per superare gravi errori di programmazione. – malhal

+0

Grazie per il commento, l'ho spiegato di più. –