Erkennen Auftreten / Verschwinden von Volumes auf osx
-
05-07-2019 - |
Frage
ich eine Liste von Speichergeräten aktualisieren möchte, wenn der Benutzer USB-Schlüssel einfügt, fügt externe Laufwerke und montiert Disk-Images. IOKit des IOServiceAddInterestNotification wie die Art und Weise sieht zu gehen, aber die offensichtliche Verwendung der Registrierung von allgemeinem Interesse in kIOMediaClass gibt nur Ihnen Benachrichtigungen für von Volumes Aushängen und dann nur manchmal.
Was ist der richtige Weg, dies zu tun?
Lösung
Die folgenden Anrufe in DiskArbitration.h tun genau das, was ich will:
-
DARegisterDiskAppearedCallback
-
DARegisterDiskDisappearedCallback
-
DARegisterDiskDescriptionChangedCallback
Diese Abdeckung Einsetzen, Entfernen (auch von unmountable Band)
Metadaten Änderungsereignisse.
P. S. Vergessen Sie nicht, Ihre DASession
zu einem Runloop
hinzufügen
oder Sie werden keine Rückrufe erhalten.
Andere Tipps
ich eine Liste von Speichergeräten aktualisieren möchte, wenn der Benutzer USB-Schlüssel einfügt, fügt externe Laufwerke und montiert Disk-Images.
Ich kann Ihnen zwei von drei mit diesem Stück Code bekommen, die ich mir vorstellen würde nicht viel mehr Arbeit benötigen Sie den dritten geben.
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.
Ich habe persönlich verwendet (eine leicht modifizierte Kopie dieses Codes) für eine lange Zeit, um die Verbindung von USB-Festplatten zu überwachen.
Wie Sie aus dieser kleinen Stichprobe sehen kann, kann es leicht anpassbar beweisen eingebundenen Laufwerke zu überwachen. Oder auch nicht. YMMV.
matchingDict = IOServiceMatching(kIOUSBDeviceClassName); // Interested in instances of class
// IOUSBDevice and its subclasses
und wenn sie paßt
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);
und so weiter, und so weiter.
Would beobachten /Volumes
für Änderungen tun, was Sie brauchen?
Wenn Sie auf der Cocoa-Ebene zu arbeiten, passieren, können Sie auch registrieren die folgenden Mitteilungen von NSWorkspace :
- NSWorkspaceDidMountNotification
- NSWorkspaceDidRenameVolumeNotification
- NSWorkspaceWillUnmountNotification
- NSWorkspaceDidUnmountNotification