Зачем использовать NSFileManager, а не просто использовать метод writeToFile: atomically: метод NSData при создании нового файла? - PullRequest
19 голосов
/ 27 февраля 2012

Рассмотрим следующие два примера кода:

    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:?

Ответы [ 3 ]

37 голосов
/ 27 февраля 2012

Преимуществом метода NSFileManager является поле attributes:

Словарь, содержащий атрибуты, связанные с новым файлом. Эти атрибуты можно использовать для установки номера владельца и группы, прав доступа к файлу и даты изменения. Список ключей см. В разделе «Ключи атрибутов файла». Если вы укажете nil для атрибутов, файл будет создан с набором атрибутов по умолчанию.

Эта функция необычна для использования в iOS, но NSFileManager намного старше, чем iOS.

Кстати, дополнительная строка, которую вы описываете, почти никогда не появляется в реальном коде. Либо у вас уже есть переменная fileManager, которую вы использовали по другим причинам, либо вы объединяете две строки в одну:

[[NSFileManager defaultManager] createFileAtPath:fullPath contents:imgData attributes:nil];

И еще один. Как вы заметили:

Дополнительным преимуществом первого примера является то, что он может перезаписать уже существующий файл с тем же именем.

Ну, это преимущество или недостаток в зависимости от того, что вы хотите. Если вы имеете в виду «создать этот файл, но не перезаписывать его, если он уже существует», то метод FM гораздо удобнее. Может быть, это ошибка перезаписать существующий файл; это спасает вас от звонка на fileExistsAtPath:. Может быть, вы хотите создать пустой файл, если его там нет, но оставить его в покое, если он есть Просто: передайте [NSData data] в качестве значения contents.

То, что лучше, зависит от того, какую проблему вы решаете.

0 голосов
/ 04 ноября 2015

Недавно я обнаружил, что writeToFile:atomically: не подходит при модульном тестировании кода.Чтобы сделать тестирование удобным, мне нужно было ввести NSFileManager в класс, а в тесте я использовал проверенный файловый менеджер для проверки поведения.

0 голосов
/ 08 марта 2013

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

...