2010-04-24 2 views

ответ

49

Атомный вообще означает, что операция не может быть прервана будет завершена или не будет иметь никакого эффекта. При записи файлов это выполняется путем записи во временный файл, а затем заменяя оригинал временным, когда запись завершается.

Сбой при записи атомного файла означает, что оригинал не изменен, и есть файл мусора, который можно удалить. Авария при записи обычно означает, что ожидаемый хороший файл поврежден.

Производительность разумная, минимальная стоимость. Во время записи у вас будет две копии файла. Замена файла - очень простая операция на уровне файловой системы.

Edit: благодаря zneak

+6

Атомный означает, что операция происходит полностью или полностью. Он может быть прерван или остановлен или возобновлен, он просто не изменит состояние системы до тех пор, пока она не будет завершена. Хотя, заключение остается прежним. – zneak

+0

Я бы не назвал это «у вас будет две копии файла», так как слишком легко прочитать, что означает две копии точных данных, что не так. –

0

Файловые не должны прибегать писать/переименовывать циклы для атомных записи. Файловые системы, имеющие семантику блокировки, позволяют вам блокировать части или весь файл, а в некоторых случаях даже делать такие вещи, как добавления к файлу, чтобы помочь с атомарностью.

@ Randy, оба предположения о фрагментации, вероятно, будут неправильными. В большинстве файловых систем запись всего файла и его закрытие приведет к менее фрагментированному файлу, и запись большого файла в одну запись, безусловно, приведет к лучшему использованию больших блоков. Если вы имели в виду, что блоки файлов имеют большую вероятность «ползать» по всему диску, это зависит от настроек макета в вашей файловой системе. Если вы пишете на флеш, вы, вероятно, хотите, чтобы файловая система ползала по доступному хранилищу как своего рода самовыравнивание записей.

0

Написание атомарно требует дополнительных действий - дополнительно создается вспомогательный файл. NSString Класс Reference объясняет:

Если ДА, приемник записывается в вспомогательный файл, а затем вспомогательный файл переименовывается в путь. Если НЕТ, приемник записывается непосредственно в путь. Параметр YES гарантирует, что путь, если он существует на , не будет поврежден, даже если система должна произойти сбой во время записи .

Вот пример в случае pLists:

[array writeToFile:path atomically:YES]; 

когда «ДА», то Plist обновляется только один раз, даже если запустить код несколько раз в XCode,

[array writeToFile:path atomically:NO]; 

, когда «НЕТ» обновляется столько, сколько вы запускаете тот же код (повторное обновление).

+0

понятия не имею, почему некоторые люди отказали в ответе без каких-либо объяснений. –

+1

Я думаю, потому что они считают, что вам не следует полагаться на недокументированные тонкости API для преодоления серьезных ошибок программирования. – malhal

+0

Спасибо за комментарий, я объяснил это больше. –

Смежные вопросы