2016-07-21 10 views
1

Я разрабатываю приложение, которое использует дисковый арбитраж, чтобы выяснить, какие устройства подключены к машине, и реагировать на подключение/отключение событий и что работает хорошо годами. Совсем недавно я обнаружил, что что-то не работает должным образом при работе с внешними накопителями thunderbolt, и я отлаживал это, чтобы найти, что выталкиваемое свойство тома (kDADiskDescriptionMediaEjectableKey в Disk Arbitration, которое соответствует kIOMediaEjectableKey i IOKit), установлено в false. Однако привод отображается с кнопкой извлечения.Приводы Thunderbolt не помечены как извлеченные в арбитраж диска/iokit, хотя они явно

Что искатель использует, чтобы решить, является ли этот том эжекционным? Очевидно, не очевидный kDADiskDescriptionMediaEjectableKey.

Любой намек оценили.

+0

Я не уверен на это на 100%, но я подозреваю, что OS X показывает кнопку извлечения для любых внешних дисков. (т. е. не внутренний: 'kDADiskDescriptionDeviceInternalKey' является ложным). Приводы Thunderbolt - это действительно просто внешние контроллеры дисков PCIe и не имеют концепции шины« выталкивания »; щелчок выталкивания обычно просто отключает громкость и отправляет диск в режим ожидания. Вы можете повторно установить его в любое время, если вы его не отключите. Сравните это со многими USB-накопителями, которые на самом деле, похоже, упадут с шины, когда вы их выталкиваете. – pmdj

+0

ОК, большое спасибо! Это единственная альтернатива, которую я видел, но документация isInternal в лучшем случае отрывочна, но до сих пор для всех проверенных дисков это кажется правильным, поэтому я, вероятно, сделаю это. Я буду ждать немного больше ответов, прежде чем закрывать это, чтобы дать еще несколько ответов, но тогда я, вероятно, соглашусь с этим в качестве ответа. – user1573546

+0

Соблюдая собственные драйверы устройства хранения данных, я могу сказать, что внутреннее/внешнее различие чисто основано на драйверах - так что водитель вполне может утверждать, что внешний накопитель является внутренним и наоборот. В какой-то степени вам просто нужно доверять этому драйверу ... В любом случае, я отвечу на свой ответ, а не на комментарий. – pmdj

ответ

0

Я не уверен на этом, но я подозреваю, что OS X показывает кнопку извлечения для любых внешних дисков. (т. е. не внутренне: kDADiskDescriptionDeviceInternalKey является ложным). Приводы Thunderbolt - это действительно просто внешние контроллеры дисков PCIe (SATA или что-то еще) и не имеют концепции шины «выталкивания»; щелчок выталкивания обычно просто отключает громкость и отправляет диск в режим ожидания. Вы можете повторно установить его в любое время, если вы его не отключите. Сравните это со многими USB-накопителями, которые на самом деле, похоже, упадут с шины, когда вы их выталкиваете. Поэтому, если драйвер поддерживает явное действие «извлечения», это также будет выполнено, когда вы выберете eject, но это не является обязательным требованием для показа пользовательского интерфейса eject.

+0

Как встречный пример, здесь у меня есть образ диска, на котором я смонтирован, где kDADiskDescriptionDeviceInternalKey истинно. – Trejkaz

0

Я не нашел другого способа, кроме эвристики, основанной на пробной версии и ошибке с таким количеством устройств, как я мог найти. На kDADiskDescriptionMediaEjectableKey или kDADiskDescriptionMediaRemovableKey или kDADiskDescriptionDeviceInternalKey можно опираться, например. SD-карта, вставленная в встроенный считыватель карт Macbook, имеет значение kDADiskDescriptionDeviceInternalKey. Таким образом, условие, которое я использую сейчас:

MediaEjectable == true || MediaRemovable == true || DeviceInternal = false) || DeviceProtocol == "USB" || DeviceProtocol == «FireWire»

Очень уродливый, но не нашел лучшего способа.

 Смежные вопросы

  • Нет связанных вопросов^_^