Pergunta

Eu quero atualizar uma lista de dispositivos de armazenamento como as chaves USB inserções de usuários, adiciona discos externos e imagens de disco monta. IOServiceAddInterestNotification do IOKit parece o caminho a percorrer, mas o uso óbvio de registrar interesse geral na kIOMediaClass só lhe dá notificações para desmontar de volumes e depois só às vezes.

O que é o caminho certo para fazer isso?

Foi útil?

Solução

As seguintes chamadas em DiskArbitration.h não exatamente o que eu quero:

  • DARegisterDiskAppearedCallback
  • DARegisterDiskDisappearedCallback
  • DARegisterDiskDescriptionChangedCallback

Estes inserção de capas, remoção (mesmo de volumes desmontáveis)
eventos de alteração de metadados.

P.S. Não se esqueça de adicionar o seu DASession a um RunLoop
ou você não terá nenhuma retornos de chamada.

Outras dicas

Eu quero atualizar uma lista de dispositivos de armazenamento como as chaves USB inserções de usuários, adiciona discos externos e imagens de disco monta.

Eu posso te dois em cada três com este pedaço de código, que eu imagino não exigiria muito mais trabalho para dar-lhe o terceiro.

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

Eu usei pessoalmente (uma cópia ligeiramente modificada deste código) por um longo tempo, para monitorar a conexão de discos rígidos USB.

Como você pode ver a partir desta pequena amostra, pode facilmente provar adaptável a monitor de unidades montadas. Ou talvez não. YMMV.

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

e quando ele corresponde

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

e assim por diante, e assim por diante.

Será que /Volumes prestando atenção para mudanças fazer o que você precisa?

Se acontecer de você estar trabalhando no nível do Cacau, você também pode se cadastrar para receber as seguintes notificações de NSWorkspace :

  • NSWorkspaceDidMountNotification
  • NSWorkspaceDidRenameVolumeNotification
  • NSWorkspaceWillUnmountNotification
  • NSWorkspaceDidUnmountNotification
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top