2008-10-05 22 views
1

我想在用戶插入USB密鑰,添加外部磁盤並裝載磁盤映像時更新存儲設備列表。 IOKit的IOServiceAddInterestNotification看起來像是要走的路,但在kIOMediaClass中註冊普遍興趣的明顯使用只會爲您提供用於卸載卷的通知,並且有時只會提供通知。檢測osx上的卷的外觀/消失

什麼是正確的方法來做到這一點?

回答

3

在DiskArbitration.h以下呼叫做我想做什麼:

  • DARegisterDiskAppearedCallback
  • DARegisterDiskDisappearedCallback
  • DARegisterDiskDescriptionChangedCallback

蓋插入刪除(甚至無法卸載卷)這些,
元數據更改事件。

P.S.不要忘了添加您的DASession到runloop
或者你不會得到任何回調。

0

會看/Volumes以進行更改嗎?

+1

不,不能保證插入的設備將被安裝。它可能是空白或損壞或無法識別的格式。 – 2008-10-05 16:45:20

0

如果發生在可可層面上的工作,你也可以註冊從NSWorkspace收到以下通知:

  • NSWorkspaceDidMountNotification
  • NSWorkspaceDidRenameVolumeNotification
  • NSWorkspaceWillUnmountNotification
  • NSWorkspaceDidUnmountNotification
+0

這對於向後兼容性很好,但如果DA框架可用,我會強烈建議使用該框架,因爲使用DA框架可以獲得更詳細的信息,再加上它可能會更可靠一些。 – 2014-03-18 20:12:54

1

我想在用戶插入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. 

http://opensource.apple.com/source/IOUSBFamily/IOUSBFamily-385.4.1/Examples/Another%20USB%20Notification%20Example/USBNotificationExample.c

我個人使用很長一段時間(這段代碼稍加修改的副本),以監測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); 

等等,等等。