OSX上のボリュームの出現/消失の検出
-
05-07-2019 - |
質問
ユーザーがUSBキーを挿入し、外部ディスクを追加し、ディスクイメージをマウントすると、ストレージデバイスのリストを更新したい。 IOKitのIOServiceAddInterestNotificationは進むべき方法のように見えますが、kIOMediaClassに一般的な関心を登録することの明らかな使用は、ボリュームのアンマウントの通知を提供するだけで、それから時々のみです。
これを行う正しい方法は何ですか?
解決
DiskArbitration.hでの次の呼び出しは、まさに私が望むことをします:
-
DARegisterDiskAppearedCallback
-
DARegisterDiskDisappearedCallback
-
DARegisterDiskDescriptionChangedCallback
これらのカバーの挿入、取り外し(マウントできないボリュームも含む)
メタデータ変更イベント。
PS DASession
をrunloop
に追加することを忘れないでください
または、コールバックを取得しません。
他のヒント
ユーザーがUSBキーを挿入し、外部ディスクを追加し、ディスクイメージをマウントすると、ストレージデバイスのリストを更新したい。
このコードで3つのうち2つを取得できますが、3つ目のコードを作成するのにこれ以上の作業は必要ないと思います。
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 HDDの接続を監視するために、私は長い間(このコードのわずかに変更されたコピー)を個人的に使用しました。
この小さなサンプルからわかるように、マウントされたドライブの監視に簡単に適応できることがわかります。またはそうでないかもしれません。 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
を見て、必要なことをしますか?
Cocoaレベルで作業している場合は、 NSWorkspace :
- NSWorkspaceDidMountNotification
- NSWorkspaceDidRenameVolumeNotification
- NSWorkspaceWillUnmountNotification
- NSWorkspaceDidUnmountNotification
所属していません StackOverflow