检测osx上卷的出现/消失

时间:2008-10-05 11:53:13

标签: macos volume device iokit diskarbitration

我想在用户插入USB密钥,添加外部磁盘和安装磁盘映像时更新存储设备列表。 IOKit的IOServiceAddInterestNotification看起来像是要走的路,但是在kIOMediaClass中注册一般兴趣的明显用途只会为你提供卸载卷的通知,然而有时只会提供通知。

这样做的正确方法是什么?

4 个答案:

答案 0 :(得分:3)

DiskArbitration.h中的以下调用完全符合我的要求:

  • DARegisterDiskAppearedCallback
  • DARegisterDiskDisappearedCallback
  • DARegisterDiskDescriptionChangedCallback

这些盖子插入,移除(即使是无法安装的卷) 元数据更改事件。

P.S。不要忘记将DASession添加到runloop中 或者你不会得到任何回调。

答案 1 :(得分: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硬盘的连接。

从这个小样本中可以看出,它很容易证明适用于监控已安装的驱动器。或者它可能不会。 YMMV。

    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);

依此类推,等等。

答案 2 :(得分:0)

观看/Volumes更改是否符合您的要求?

答案 3 :(得分:0)

如果您正好在Cocoa级别工作,您还可以注册以接收来自NSWorkspace的以下通知:

  • NSWorkspaceDidMountNotification
  • NSWorkspaceDidRenameVolumeNotification
  • NSWorkspaceWillUnmountNotification
  • NSWorkspaceDidUnmountNotification