Spotlightクエリ(obj-c)から返されたMDItemRefアイテムのリストを受け取ったとき、それらがOSインストールドライブからのものか、外部接続されたUSBドライブからのものかを簡単に判断する方法があるかどうか疑問に思いました。
基本的な前提は、ローカルドライブからのすべてを無視し、外部USBドライブ上のファイルのみを監視することです。
ありがとう!
Spotlightクエリ(obj-c)から返されたMDItemRefアイテムのリストを受け取ったとき、それらがOSインストールドライブからのものか、外部接続されたUSBドライブからのものかを簡単に判断する方法があるかどうか疑問に思いました。
基本的な前提は、ローカルドライブからのすべてを無視し、外部USBドライブ上のファイルのみを監視することです。
ありがとう!
Unasugerencíasimple:
アイテムのパスを取得し、プレフィックスが「/Volumes/」であるかどうかを確認します。そうである場合は、外部デバイス上にあります。
例:
MDItemRef myItem = ...;
NSString * itemPath = (NSString *)MDItemCopyAttribute(myItem, kMDItemPath);
if ([itemPath hasPrefix:@"/Volumes/"]) {
NSLog(@"Found external item");
} else {
NSLog(@"Found internal item");
}
[itemPath release];
/ Volumesのパスをチェックする際の問題は、/ Volumes/WINDOWSなどの内部パーティションも含まれることです。また、まれですが、外付けドライブに/Volumes以外のマウントポイントを含めることができます
より正しい方法は、、、などのボリュームに関する情報を含む構造を取得するために使用するFSGetVolumeParms()
ことです。 GetVolParmsInfoBuffer
bIsEjectable
bIsRemovable
bIsOnInternalBus
以下を使用して、FSRefからFSVolumeRefNumを取得できますFSGetCatalogInfo()
。
FSCatalogInfo info = {0};
OSErr status = FSGetCatalogInfo(&fsRef, kFSCatInfoVolume, &info, nil, nil, nil);
if (status == noErr)
{
_volumeRefNum = info.volume;
}
volumeRefを使用すると、ボリュームパラメータを取得できます。
FSGetVolumeParms(_volumeRefNum, &_params, sizeof(_params));
_paramsは、次のGetVolParmsInfoBuffer
ような情報を持つ構造体です。
- (BOOL) isEjectable
{
return (_params.vMExtendedAttributes & (1 << bIsEjectable)) != 0;
}
- (BOOL) isRemovable
{
return (_params.vMExtendedAttributes & (1 << bIsRemovable)) != 0;
}
- (BOOL) isAutoMounted
{
return (_params.vMExtendedAttributes & (1 << bIsAutoMounted)) != 0;
}
- (BOOL) isExternal
{
return (_params.vMExtendedAttributes & (1 << bIsOnExternalBus)) != 0;
}
- (BOOL) isInternal
{
return (_params.vMExtendedAttributes & (1 << bIsOnInternalBus)) != 0;
}
非ブートドライブまたは外付けドライブのみを調べていますか(ほとんどの場合、それらは同じ意味ですが、複数のパーティションまたは複数の内部ドライブを備えたシステム(Mac Pro)では異なる場合があります。
非内部ドライブのみが必要な場合は、パスの前にリムーバブルドライブマウントポイントが付いているかどうかを確認できます。
デイブのコードに似ています:
MDItemRef myItem = ...;
NSString * itemPath = (NSString *)MDItemCopyAttribute(myItem, kMDItemPath);
NSArray * removableVolumes = [[NSWorkspace sharedWorkspace] mountedRemovableMedia];
BOOL externalVolume = NO;
for (NSString *eachVolume in removableVolumes) {
if ([itemPath hasPrefix: eachVolume]) {
externalVolume = YES;
break;
}
}
逆さま-内蔵ドライブを無視します(それが目的の場合)。
欠点-マウントされたドライブイメージが含まれます(あなたの場合、Spotlightインデックスが付けられている場合、私は推測します)。
これには実際には少し作業が必要です。たとえば、内部ドライブのマウントポイントが外部ドライブと同じプレフィックスを持っている場合、誤検知が返される可能性があります。たとえば、内部ドライブは「/ Volumes /drive_2」にマウントされ、外部ドライブは「/ Volumes/drive」にマウントされます。 "。