Detectando aparecimento / desaparecimento de volumes no OSX
-
05-07-2019 - |
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?
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.
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