Зачем использовать NSFileManager, а не просто использовать NSData writeToFile: atomically: метод при создании нового файла?
Рассмотрим следующие два примера кода:
NSData *imgData = UIImagePNGRepresentation(imgFull);
NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"itemImg_%i.png", timestamp]]; //add our image to the path
[imgData writeToFile:fullPath atomically:YES];
и
NSData *imgData = UIImagePNGRepresentation(imgFull);
NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"itemImg_%i.png", timestamp]]; //add our image to the path
NSFileManager *fileManager = [NSFileManager defaultManager];
[fileManager createFileAtPath:fullPath contents:imgData attributes:nil];
Второй пример требует дополнительной строки кода и инициализации объекта NSFileManager, тогда как в первом примере просто объект NSData imgData
записывается в файл. Дополнительным преимуществом первого примера является то, что он может перезаписать предварительно существующий файл с тем же именем.
Мой вопрос: при создании новых файлов, при каких обстоятельствах вы действительно хотите использовать NSFileManager и его метод createFileAtPath:contents:attributes:
?
Ответы
Ответ 1
Преимуществом метода NSFileManager
является поле attributes
:
Словарь, содержащий атрибуты для связи с новым файлом. Эти атрибуты можно использовать для установки номера владельца и группы, разрешений файлов и дат изменения. Список ключей см. В разделе "Ключи атрибутов файла". Если вы укажете nil для атрибутов, файл будет создан с набором атрибутов по умолчанию.
Эта функция необычна для использования в iOS, но NSFileManager
намного старше iOS.
Кстати, дополнительная строка, которую вы описываете, почти никогда не появляется в реальном коде. Либо у вас уже есть переменная fileManager
, которую вы использовали по другим причинам, либо объедините две строки в одну:
[[NSFileManager defaultManager] createFileAtPath:fullPath contents:imgData attributes:nil];
И еще один. Как вы заметили:
Дополнительным преимуществом первого примера является то, что он может перезаписать уже существующий файл с тем же именем.
Ну, это преимущество или недостаток в зависимости от того, что вы хотите. Если вы имеете в виду "создать этот файл, но не перезаписывайте его, если он уже существует", то метод FM намного удобнее. Возможно, это ошибка для перезаписывания существующего файла; это приведет к вызову fileExistsAtPath:
. Возможно, вы хотите создать пустой файл, если он не существует, но оставьте его в покое, если он есть. Простой: передать [NSData data]
как значение contents
.
Итак, что лучше зависит от того, какую проблему вы решаете.
Ответ 2
в соответствии с моими знаниями и после того, как прочитал ответ Роба, большинство операций с файлами могут выполняться с использованием объекта общего файлового менеджера. потому что каждый путь генерируется только один раз. Так что не может возникнуть ситуация переопределения. Пожалуйста, исправьте, если я ошибаюсь.
Ответ 3
В последнее время я обнаружил, что writeToFile:atomically:
не подходит для модульного тестирования кода. Для удобства тестирования мне пришлось вводить NSFileManager
в класс, и в тесте я использовал mocked file manager для проверки поведения.