Будет writeToFile: атомарно: перезаписывать данные?

93

Действительно простой вопрос, но в документации Apple он не совсем ясен.

Будет ли writeToFile:atomically:for NSDataи NSArrayт.д. перезаписывать существующие данные в файле?

Джихо Кан
источник

Ответы:

213

Да. Это будет.

Вот некоторые символы, которые могут преодолеть ограничение в 30 символов.

Би Джей Гомер
источник
20
Делаете ли вы это атомарно или нет, не имеет значения; в любом случае файл будет полностью перезаписан новыми данными.
BJ Homer
Ах, но для меня это не удается, и исходный файл не поврежден. Поскольку writeToFile не возвращает NSError, как я могу исследовать сбой? это может быть проблема с разрешениями, но я не уверен. Мой код работает как пакет подключаемого модуля установщика для установочного пакета, который требует привилегий root - я не знаю, как проверить / распечатать привилегии, с которыми выполняется мой код.
Мотти Шнеор
1
@MottiShneor Вместо этого вы можете использовать -writeToURL: options: error:, у которого есть параметр ошибки.
BJ Homer
7

Метод writeToFile:atomically: ВСЕГДА ПЕРЕЗАПИСАТЬ ФАЙЛ , независимо от atomically:ДА или НЕТ.

Информация из документации Apple (NSData, раздел «Сохранение данных»):

Класс NSData и его подклассы предоставляют методы для быстрого и простого сохранения своего содержимого на диск. Чтобы свести к минимуму риск потери данных, эти методы предоставляют возможность атомарного сохранения данных. Атомарные записи гарантируют, что данные либо сохраняются полностью, либо полностью выходят из строя. Атомарная запись начинается с записи данных во временный файл. Если эта запись завершается успешно, метод перемещает временный файл в его окончательное расположение.

Ни слова о проверке существования файла.

Например, для метода copyItemAtPath:toPath:error:в документации (NSFileManager, раздел Обсуждение) специально написано о такой проверке:

Если файл с таким именем уже существует в dstPath, этот метод останавливает попытку копирования и возвращает соответствующую ошибку.

Игорь
источник