Используя FileWrappers как контейнеры файла
NSFileWrapper
экземпляр содержит содержание файла в динамической памяти. В этой роли это позволяет объекту документа встроить файл, обрабатывая его как единицу информации, которая может быть выведена на экран как изображение (и возможно отредактирована на месте), сохраненный на диск, или передал к другому приложению. Это может также сохранить значок для представления файла в документе или в работе перетаскивания.
Экземпляры этого класса упоминаются как интерфейсные объекты файла, или просто как обертки файла. Обертка файла может быть одним из трех определенных типов: регулярная обертка файла, содержащая содержание единственного фактического файла; обертка каталога, содержащая каталог и все файлы или каталоги в нем; или обертка ссылки, просто представляющая символьную ссылку в файловой системе.
Поскольку цель обертки файла состоит в том, чтобы представлять файлы в памяти, она очень слабо связывается к любому дисковому представлению. Обертка файла не записывает путь к дисковому представлению его содержания. Это позволяет Вам сохранять ту же обертку файла с различным URLs, но она также требует, чтобы Вы записали тот URLs, если Вы хотите обновить обертку файла от диска позже.
Работа с обертками файла
Можно создать обертку файла из данных в памяти с помощью initWithSerializedRepresentation:
метод или от данных по диску с помощью initWithURL:options:error:
метод. Оба создают надлежащий тип обертки файла на основе природы сериализированного представления или файла на диске.
Три удобных метода каждый создает обертку файла определенного типа: initRegularFileWithContents:
, initDirectoryWithFileWrappers:
, и initSymbolicLinkWithDestination:
. Поскольку каждый метод инициализации создает обертки файла различных типов или состояний, они все определяются инициализаторы для этого класса — подклассы должны обоснованно переопределить их всех по мере необходимости.
Некоторые методы обертки файла применяются только к определенному типу обертки, и исключение повышено, если метод отправил к обертке файла неправильного типа. Для определения типа обертки файла используйте isRegularFile
, isDirectory
, и isSymbolicLink
методы.
Обертка файла хранит информацию о файловой системе (такую как время изменения и права доступа), который это обновляет при чтении из диска и использует при записи файлов в диск. fileAttributes
метод возвращает эту информацию в формате, описанном в NSFileManager
метод attributesOfItemAtPath:error:
. Можно также установить атрибуты файла с помощью setFileAttributes:
метод.
NSFileWrapper
класс позволяет Вам устанавливать предпочтительное имя файла для операций сохранения, и он записывает последнее имя файла, к которому он был фактически сохранен; preferredFilename
и filename
методы возвращают эти имена. Эта функция является самой важной для оберток каталога, тем не менее, и так обсуждена при Работе с Обертками Каталога.
При сохранении обертки файла на диск Вы обычно определяете каталог, который Вы хотите сохранить ее в, затем добавить предпочтительное имя файла к тому каталогу URL и использовать writeToURL:options:originalContentsURL:error:
метод, сохраняющий содержание обертки файла и обновляющий атрибуты файла. Можно сохранить обертку файла под другим именем, если Вам нравится, но это выполнение так может привести к зарегистрированному имени файла, отличающемуся от предпочтительного имени файла, в зависимости от того, как Вы вызываете writeToURL:options:originalContentsURL:error:
метод.
Помимо сохранения на диск его содержания, обертка файла может перечитать их от диска при необходимости. matchesContentsOfURL:
метод определяет возможно, ли дисковое представление, изменилось, на основе атрибутов файла сохранил в прошлый раз, когда файл был считан или записан. Если время изменения обертки файла или права доступа отличаются от тех из файла на диске, этот метод возвраты YES
. Можно тогда использовать readFromURL:options:error:
перечитывать файл от диска.
Наконец, для передачи обертки файла к другому процессу или системе (например, с помощью области монтажа), Вы используете serializedRepresentation
метод для получения NSData
объект, содержащий содержание обертки файла в NSFileContentsPboardType
формат. Можно безопасно передать это представление по любому каналу, который Вы выбираете. Получатель представления может тогда перераспределить обертку файла с помощью initWithSerializedRepresentation:
метод.
Работа с обертками каталога
Обертка каталога содержит другие обертки файла (любого типа) и позволяет Вам получать доступ к ним ключами, полученными из их предпочтительных имен файлов. Можно добавить любой тип обертки файла к обертке каталога с addFileWrapper:
метод и удаляет его с removeFileWrapper:
метод. Удобные методы addRegularFileWithContents:preferredFilename:
и addSymbolicLinkWithDestination:preferredFilename:
позвольте Вам добавлять регулярный файл и обертки ссылки, также определяя их предпочтительные имена.
Обертка каталога хранит свое содержание в NSDictionary
объект, который можно получить использование fileWrappers
метод. Ключи этого словаря основываются на предпочтительных именах файлов каждой обертки файла, содержавшейся в обертке каталога. Там существуйте, тогда, три идентификатора для обертки файла в обертке каталога:
Предпочтительное имя файла. Этот идентификатор не однозначно определяет обертку файла, но другие идентификаторы всегда на основе его.
Ключ Dictionary. Когда нет никаких других оберток файла того же предпочтительного имени в той же обертке каталога, этот идентификатор всегда равен предпочтительному имени. Иначе, это - строка, сделанная путем добавления уникального префикса к предпочтительному имени файла. Обратите внимание на то, что та же обертка файла может иметь различный ключ словаря для каждой обертки каталога, содержащей ее. Вы используете ключ словаря для получения интерфейсного объекта файла в памяти, для получения ее содержания или ее имени файла (т.е. для обновления его от диска). Можно получить ключ словаря обертки файла путем отправки a
keyForFileWrapper:
обменивайтесь сообщениями к обертке каталога, содержащей его.Имя файла. Этот идентификатор обычно на основе предпочтительного имени файла, но является не обязательно тем же как им или ключом словаря. Вы используете имя файла для обновления единственной обертки файла относительно пути обертки каталога, содержащей его. Обратите внимание на то, что имя файла может измениться каждый раз, когда Вы сохраняете обертку каталога, содержащую обертку файла. Особенно, если обертка файла была добавлена к нескольким различным оберткам каталога. Таким образом необходимо всегда получать имя файла от самой обертки файла каждый раз, когда Вам нужен он вместо того, чтобы кэшировать его.
При работе с содержанием обертки каталога можно использовать перечислитель словаря, чтобы получить каждую обертку файла и выполнить безотносительно работы, в которой Вы нуждаетесь. За исключениями сохранения и обновления, обертка файла каталога не определяет рекурсивных операций для своего содержания. Чтобы установить атрибуты файла для всех содержавших оберток файла или выполнить любую другую такую работу, необходимо определить рекурсивный метод, исследующий тип каждой обертки файла и вызывающий себя снова для любой обертки каталога, с которой это встречается.
При сохранении оберток файла каталога к контейнеру iCloud необходимо экспортировать должным образом отформатированный UTI для документа. Для получения дополнительной информации посмотрите Работу С Обертками Файла.