Detección de aparición / desaparición de volúmenes en osx.
-
05-07-2019 - |
Pregunta
Quiero actualizar una lista de dispositivos de almacenamiento a medida que el usuario inserta llaves USB, agrega discos externos y monta imágenes de discos. IOService IOServiceAddInterestNotification parece ser el camino a seguir, pero el uso obvio de registrar el interés general en kIOMediaClass solo le proporciona notificaciones para el desmontaje de volúmenes y solo algunas veces.
¿Cuál es la forma correcta de hacer esto?
Solución
Las siguientes llamadas en DiskArbitration.h hacen exactamente lo que quiero:
DARegisterDiskAppearedCallback
DARegisterDiskDisappearedCallback
DARegisterDiskDescriptionChangedCallback
Estos cubren la inserción, extracción (incluso de volúmenes que no se pueden montar)
Eventos de cambio de metadatos.
P.S. No olvide agregar su DASession
a un runloop
o no recibirá ninguna devolución de llamada.
Otros consejos
Deseo actualizar una lista de dispositivos de almacenamiento a medida que el usuario inserta llaves USB, agrega discos externos y monta imágenes de disco.
Puedo obtener dos de tres con este código, que imagino que no requeriría mucho más trabajo para obtener el tercero.
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.
Personalmente he usado (una copia ligeramente modificada de este código) durante mucho tiempo, para monitorear la conexión de discos duros USB.
Como puede ver en esta pequeña muestra, puede resultar fácilmente adaptable a las unidades montadas en el monitor. O puede que no. YMMV.
matchingDict = IOServiceMatching(kIOUSBDeviceClassName); // Interested in instances of class
// IOUSBDevice and its subclasses
y cuando coincide
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);
y así sucesivamente, y así sucesivamente.
¿Vería / Volumes
por cambios lo que necesita?
Si está trabajando en el nivel de Cocoa, también puede registrarse para recibir las siguientes notificaciones de NSWorkspace :
- NSWorkspaceDidMountNotification
- NSWorkspaceDidRenameVolumeNotification
- NSWorkspaceWillUnmountNotification
- NSWorkspaceDidUnmountNotification