Détection d'apparition / disparition de volumes sur osx
-
05-07-2019 - |
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?
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.
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