我想在用戶插入USB密鑰,添加外部磁盤並裝載磁盤映像時更新存儲設備列表。 IOKit的IOServiceAddInterestNotification看起來像是要走的路,但在kIOMediaClass中註冊普遍興趣的明顯使用只會爲您提供用於卸載卷的通知,並且有時只會提供通知。檢測osx上的卷的外觀/消失
什麼是正確的方法來做到這一點?
我想在用戶插入USB密鑰,添加外部磁盤並裝載磁盤映像時更新存儲設備列表。 IOKit的IOServiceAddInterestNotification看起來像是要走的路,但在kIOMediaClass中註冊普遍興趣的明顯使用只會爲您提供用於卸載卷的通知,並且有時只會提供通知。檢測osx上的卷的外觀/消失
什麼是正確的方法來做到這一點?
在DiskArbitration.h以下呼叫做我想做什麼:
DARegisterDiskAppearedCallback
DARegisterDiskDisappearedCallback
DARegisterDiskDescriptionChangedCallback
蓋插入刪除(甚至無法卸載卷)這些,
元數據更改事件。
P.S.不要忘了添加您的DASession
到runloop
或者你不會得到任何回調。
會看/Volumes
以進行更改嗎?
如果發生在可可層面上的工作,你也可以註冊從NSWorkspace收到以下通知:
這對於向後兼容性很好,但如果DA框架可用,我會強烈建議使用該框架,因爲使用DA框架可以獲得更詳細的信息,再加上它可能會更可靠一些。 – 2014-03-18 20:12:54
我想在用戶插入USB密鑰,添加外部磁盤並掛載磁盤映像時更新存儲設備列表。
我可以用這段代碼給你兩分之三,我想這不會需要更多的工作來給你第三個。
File: USBNotificationExample.c
Description: This sample demonstrates how to use IOKitLib and IOUSBLib to set up asynchronous
callbacks when a USB device is attached to or removed from the system.
It also shows how to associate arbitrary data with each device instance.
我個人使用很長一段時間(這段代碼稍加修改的副本),以監測USB硬盤驅動器的連接。
從這個小樣本中可以看出,它很容易證明適用於監控安裝的驅動器。或者它可能不會。因人而異。
matchingDict = IOServiceMatching(kIOUSBDeviceClassName); // Interested in instances of class
// IOUSBDevice and its subclasses
,當它匹配
void DeviceAdded(void *refCon, io_iterator_t iterator)
{
kern_return_t kr;
io_service_t usbDevice;
IOCFPlugInInterface **plugInInterface=NULL;
SInt32 score;
HRESULT res;
while ((usbDevice = IOIteratorNext(iterator)))
{
io_name_t deviceName;
CFStringRef deviceNameAsCFString;
MyPrivateData *privateDataRef = NULL;
UInt32 locationID;
printf("Device 0x%08x added.\n", usbDevice);
等等,等等。
不,不能保證插入的設備將被安裝。它可能是空白或損壞或無法識別的格式。 – 2008-10-05 16:45:20