Подтвердить что ты не робот

Зачем использовать 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:?

4b9b3361

Ответ 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 для проверки поведения.