Объемы, не обнаруживающиеся на рабочем столе
Q: Я пишу пользовательскую файловую систему (плагин VFS). Я могу смонтировать свой объем очень хорошо на уровне BSD, но его значок не обнаруживается на рабочем столе. Как я могу заставить объемы своей файловой системы обнаружиться на рабочем столе?
A: Я пишу пользовательскую файловую систему (плагин VFS). Я могу смонтировать свой объем очень хорошо на уровне BSD, но его значок не обнаруживается на рабочем столе. Как я могу заставить объемы своей файловой системы обнаружиться на рабочем столе?
При разработке локальной файловой системы (использующий терминологию от Технических Вопросов и ответов QA1242, 'Разрабатывая для VFS'), необходимо создать пакет файловой системы и установить его в /System/Library/Filesystems. Формат пакета файловой системы формально не документируется (r. 3524590), но можно смотреть на Пример кода 'MFSLives' для примера. Для локальной файловой системы системный пакет правильного файла (включая встроенную утилиту и монтируют инструменты) достаточен для системы, чтобы зондировать и смонтировать Вашу файловую систему, и для Ваших объемов для автоматического появления на рабочем столе.
Это, однако, не достаточно для сетевой файловой системы. Сетевая файловая система должна иметь пакет файловой системы (это позволяет Средству поиска показывать корректное локализованное имя в Поле формата окна Get Info), но это не достаточно для Ваших объемов для разоблачения на рабочем столе автоматически. Для сетевой файловой системы пользователь обычно делает некоторую явную работу для монтирования объема. Для встроенных сетевых файловых систем (AppleShare, SMB, и т.д.), пользователи монтируют объем с помощью Подключения к диалоговому окну Сервера в Средстве поиска, или путем просмотра /Network. В настоящее время нет никакого пути к сторонним сетевым файловым системам для интеграции в эти стандартные расположения. Посмотрите Технические Вопросы и ответы QA1387, 'Интегрирующийся С Подключением к Диалоговому окну Сервера' для подробных данных.
Если Вы последуете совету из того документа и создадите Ваше собственное приложение монтирования, то Ваши объемы все еще не обнаружатся на рабочем столе. Необходимо явно уведомить sytem при монтировании нового объема. Механизм для того, чтобы сделать это документируется ниже.
В этом контексте кластерная файловая система работает тот же путь сетевой файловой системой.
Новый объем монтирует уведомление
При монтировании нового сетевого тома необходимо сказать систему об этом. Вы делаете это путем вызова подпрограммы DiskArbitration DiskArbDiskAppearedWithMountpointPing_auto. Эта подпрограмма не является частью стандартных заголовков платформы DiskArbitration, таким образом, необходимо объявить собственный прототип для него. Корректный прототип показан в Перечислении 1.
Перечисление 1 прототип DiskArbDiskAppearedWithMountpointPing_auto
extern kern_return_t DiskArbDiskAppearedWithMountpointPing_auto(
char * disk,
unsigned flags,
char * mountpoint
) __attribute__((weak_import));
enum {
kDiskArbDiskAppearedEjectableMask = 1 << 1,
kDiskArbDiskAppearedNetworkDiskMask = 1 << 3
}; |
Параметры к этой подпрограмме:
diskустройство, на котором смонтирован диск. В случае сетевого тома можно использовать любую уникальную строку. Однако это должно соответствоватьf_mntfromnameзначение, возвращенное statfs для Вашего объема.flagsдолжен бытьkDiskArbDiskAppearedEjectableMask | kDiskArbDiskAppearedNetworkDiskMask.mountpointабсолютный путь к каталогу, на котором смонтирован объем. Обычно это - уникальный подкаталог, в котором Вы создаете/Volumes.
Эта подпрограмма является частью старого (предварительный Mac OS X 10.3), частный, интерфейс платформы DiskArbitration. Когда мы представили новый, общедоступный интерфейс DiskArbitration в Mac OS X 10.3, мы не представляли замену для этой подпрограммы, потому что в долгосрочной перспективе DiskArbitration автоматически узнает о новых сетевых томах посредством уведомления ядра. Так, в конечном счете Вы не должны будете вызывать эту подпрограмму для своего объема для появления на рабочем столе. По этой причине мы строго рекомендуем слабая ссылка против этого символа и, если это не присутствует, просто не вызвать его.
Для получения дополнительной информации об этом методе, посмотрите Техническое примечание TN2064, 'Гарантировав Назад Совместимость на уровне двоичных кодов - Слабые Макросы Соединения и Доступности на Mac OS X'.
Наконец, потому что Вы вызываете старый, частный интерфейс платформы DiskArbitration, необходимо явно инициализировать тот интерфейс. Вы делаете это путем вызова DiskArbInit, прототип которого дан в Перечислении 2. Если Вам не удается сделать это, это вероятно это DiskArbDiskAppearedWithMountpointPing_auto перестанет работать с кодом ошибки 5 (KERN_FAILURE).
Перечисление 2 прототип DiskArbInit
extern kern_return_t DiskArbInit(void) __attribute__((weak_import)); |
Как с DiskArbDiskAppearedWithMountpointPing_auto, Вы должны слабая ссылка к этой подпрограмме и не вызывать его, если это не присутствует.
История версии документа
| Дата | Примечания |
|---|---|
| 20.12.2006 | Новый документ, описывающий, как сделать объем от третьего лица плагином VFS, обнаруживается на рабочем столе. |