首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从MDItemRef确定本地驱动器

从MDItemRef确定本地驱动器
EN

Stack Overflow用户
提问于 2009-10-16 17:05:14
回答 3查看 886关注 0票数 0

当我收到Spotlight查询返回的MDItemRef项目列表(在obj-c中)时,我想知道是否有一种简单的方法来确定它们是来自OS安装驱动器还是来自外部连接的U盘。

基本前提是,我希望忽略本地驱动器中的任何内容,而只监视外部USB驱动器上的文件。

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-10-17 01:14:38

Una sugerencía很简单:

抓取项目的路径并查看其前缀是否为"/Volumes/“。如果是,那么它就在外部设备上。

示例:

代码语言:javascript
复制
MDItemRef myItem = ...;
NSString * itemPath = (NSString *)MDItemCopyAttribute(myItem, kMDItemPath);
if ([itemPath hasPrefix:@"/Volumes/"]) {
  NSLog(@"Found external item");
} else {
  NSLog(@"Found internal item");
}
[itemPath release];
票数 4
EN

Stack Overflow用户

发布于 2009-10-19 04:53:00

在/Volumes中检查路径的问题是,它还包括内部分区,如/Volumes/WINDOWS。此外,尽管外部驱动器很少,但也可以有/Volumes以外的挂载点

更正确的方法是使用FSGetVolumeParms()获取包含有关卷的信息的GetVolParmsInfoBuffer结构,如bIsEjectablebIsRemovablebIsOnInternalBus

您可以使用FSGetCatalogInfo()从FSRef获取FSVolumeRefNum

代码语言:javascript
复制
FSCatalogInfo info = {0};
OSErr status = FSGetCatalogInfo(&fsRef, kFSCatInfoVolume, &info, nil, nil, nil);
if (status == noErr)
{
    _volumeRefNum = info.volume;
}

使用volumeRef,您可以获得卷参数:

代码语言:javascript
复制
FSGetVolumeParms(_volumeRefNum, &_params, sizeof(_params));

_params是一种GetVolParmsInfoBuffer结构,它包含如下信息:

代码语言:javascript
复制
- (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;   
}
票数 4
EN

Stack Overflow用户

发布于 2009-10-19 04:25:31

您是否只查看非引导驱动器或外部驱动器(大多数情况下,它们的含义相同,但在具有多个分区或多个内部驱动器的系统上,它们可能不同(Mac Pro)。

如果您只需要非内部驱动器,则可以查看路径是否带有可移动驱动器装载点前缀。

类似于Dave的代码:

代码语言:javascript
复制
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”。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1579245

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档