2009-10-16 4 views
0

스포트라이트 쿼리 (obj-c)에서 반환 된 MDItemRef 항목 목록을 받았을 때 OS 설치 드라이브와 외부 드라이브가 맞는지 확인하는 쉬운 방법이 있는지 궁금합니다. 연결된 USB 드라이브.MDItemRef에서 로컬 드라이브 확인

기본 전제 조건은 로컬 드라이브에서 아무 것도 무시하고 외부 USB 드라이브의 파일 만보고 싶다는 것입니다.

감사합니다. "//볼륨"

잡아 항목의 경로와이 접두사 않다면 참조 :

답변

4

우나은 간단 sugerencía. 그럴 경우 외부 장치에 있습니다.

예 :

MDItemRef myItem = ...; 
NSString * itemPath = (NSString *)MDItemCopyAttribute(myItem, kMDItemPath); 
if ([itemPath hasPrefix:@"/Volumes/"]) { 
    NSLog(@"Found external item"); 
} else { 
    NSLog(@"Found internal item"); 
} 
[itemPath release]; 
+0

나는 그것을 줄 것이다 ... –

0

당신은 그 의미 대부분의 시간 같은 (비 부트 드라이브 나 외장 드라이브에 찾고 있지만, 여러 파티션이나있는 시스템에에 다를 수 있습니까 . 여러 개의 내부 드라이브 (맥 프로)

만이 아닌 내부 드라이브를 원하는 경우에, 당신은 경로가 마운트 지점을 이동식 드라이브로 시작되는 경우 있는지 볼 수 데이브의 코드와 유사

을 :.

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; 
    } 
} 

위쪽 - 내부 드라이브를 무시합니다 (해당되는 경우).
아래쪽 - 마운트 된 드라이브 이미지를 포함합니다 (귀하의 경우 스포트라이트로 색인 된 경우 해당됩니다).

실제로 내부 드라이브 마운트 지점이 "/ Volumes/drive_2"및 외부 드라이브 "에 마운트 된 내부 드라이브와 같은 외부 드라이브와 같은 접두어를 갖는 경우 잘못된 긍정을 반환 할 수 있습니다./볼륨/드라이브 ".

4

/Volumes에서 경로를 검사 할 때의 문제점은/Volumes/WINDOWS와 같은 내부 파티션을 포함한다는 것입니다. 또한, 희귀하지만, 외부 드라이브가 아닌 다른 마운트 포인트/볼륨

더 올바른 방법이 bIsEjectable, bIsRemovable, bIsOnInternalBus 같은 볼륨에 대한 정보가 들어있는 GetVolParmsInfoBuffer 구조를 얻을 수 FSGetVolumeParms()을 사용하는 것입니다을 가질 수 있습니다.

당신은 FSGetCatalogInfo()를 사용하여 FSRef에서 FSVolumeRefNum를 얻을 수 있습니다 :

FSCatalogInfo info = {0}; 
OSErr status = FSGetCatalogInfo(&fsRef, kFSCatInfoVolume, &info, nil, nil, nil); 
if (status == noErr) 
{ 
    _volumeRefNum = info.volume; 
} 

을 volumeRef을 사용하면 볼륨 PARAMS를 얻을 수 있습니다 :

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; 
}