Question

Je souhaite mettre à jour une liste de périphériques de stockage au fur et à mesure que l'utilisateur insère des clés USB, ajoute des disques externes et monte des images de disque. IOServiceAddInterestNotification d'IOKit semble être la voie à suivre, mais l'utilisation évidente d'enregistrer un intérêt général dans kIOMediaClass ne vous donne des notifications que pour le démontage de volumes et parfois seulement.

Quelle est la bonne façon de faire cela?

Était-ce utile?

La solution

Les appels suivants dans DiskArbitration.h font exactement ce que je veux:

  • DARegisterDiskAppearedCallback
  • DARegisterDiskDisappearedCallback
  • DARegisterDiskDescriptionChangedCallback

Ceux-ci couvrent l'insertion, le retrait (même des volumes non montables)

événements de changement de métadonnées.

P.S. N'oubliez pas d'ajouter votre DASession à un runloop
. ou vous ne recevrez aucun rappel.

Autres conseils

  

Je souhaite mettre à jour une liste de périphériques de stockage au fur et à mesure que l'utilisateur insère des clés USB, ajoute des disques externes et monte des images de disque.

Je peux vous en procurer deux sur trois avec ce morceau de code, qui, je suppose, n'exigerait pas beaucoup plus de travail pour vous donner le troisième.

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

Je me sers personnellement (copie légèrement modifiée de ce code) depuis longtemps de surveiller la connexion de disques durs USB.

Comme vous pouvez le constater sur ce petit exemple, il peut facilement s’avérer adaptable aux lecteurs montés sur moniteur. Ou peut-être pas. YMMV.

    matchingDict = IOServiceMatching(kIOUSBDeviceClassName);        // Interested in instances of class
                                                                    // IOUSBDevice and its subclasses

et quand cela correspond

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

et ainsi de suite, et ainsi de suite.

Est-ce que surveiller / Volumes afin de modifier ce dont vous avez besoin?

Si vous travaillez au niveau du cacao, vous pouvez également vous inscrire pour recevoir les notifications suivantes de NSWorkspace :

  • NSWorkspaceDidMountNotification
  • NSWorkspaceDidRenameVolumeNotification
  • NSWorkspaceWillUnmountNotification
  • NSWorkspaceDidUnmountNotification
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top