الكشف عن ظهور/اختفاء وحدات التخزين على OSX
-
05-07-2019 - |
سؤال
أرغب في تحديث قائمة أجهزة التخزين حيث يقوم المستخدم بإدخال مفاتيح USB وإضافة أقراص خارجية وتثبيت صور القرص.يبدو أن IOServiceAddInterestNotification الخاص بـ IOKit هو الحل الأمثل، ولكن الاستخدام الواضح لتسجيل الاهتمام العام في kIOMediaClass يمنحك فقط إشعارات لإلغاء تحميل وحدات التخزين، وفي بعض الأحيان فقط.
ما هي الطريقة الصحيحة للقيام بذلك؟
المحلول
الاستدعاءات التالية في DiskArbitration.h تفعل ما أريده بالضبط:
DARegisterDiskAppearedCallback
DARegisterDiskDisappearedCallback
DARegisterDiskDescriptionChangedCallback
إدراج هذه الأغطية وإزالتها (حتى المجلدات غير القابلة للتركيب)
أحداث تغيير البيانات الوصفية.
ملاحظة.لا تنسى أن تضيف الخاص بك DASession
إلى حلقة التشغيل
أو أنك لن تحصل على أي رد الاتصال.
نصائح أخرى
وأريد تحديث قائمة أجهزة التخزين كما يقوم المستخدم بإدراج مفاتيح USB، ويضيف الأقراص الخارجية ويتصاعد الصور القرص.
اقتباس فقرة>وكنت أستطيع الحصول على اثنين من أصل ثلاثة مع هذه القطعة من التعليمات البرمجية، التي أتصور لن تتطلب الكثير من العمل لتعطيك الثالث.
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.
ولقد استعملت شخصيا (نسخة معدلة بشكل طفيف من هذا الرمز) لفترة طويلة، لرصد اتصال من محركات الأقراص الصلبة USB.
وكما ترون من هذه العينة الصغيرة، فإنه قد يثبت بسهولة قابلة للتكيف لمراقبة محركات الأقراص المحملة. أو لا يجوز. YMMV.
matchingDict = IOServiceMatching(kIOUSBDeviceClassName); // Interested in instances of class
// IOUSBDevice and its subclasses
وعندما يطابق
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);
وهكذا دواليك، وهلم جرا.
هل كان يراقب /Volumes
لإجراء تغييرات تفعل ما تريد؟
إذا كنت تعمل على مستوى الكاكاو، يمكنك أيضًا التسجيل لتلقي الإشعارات التالية من مساحة عمل:
- NSWorkspaceDidMountNotification
- NSWorkspaceDidRenameVolumeNotification
- NSWorkspaceWillUnmountNotification
- NSWorkspaceDidUnmountNotification