Objective c 是否可以通过编程方式更改Mac OS X上已安装驱动器上的卷图标?

Objective c 是否可以通过编程方式更改Mac OS X上已安装驱动器上的卷图标?,objective-c,macos,macfuse,Objective C,Macos,Macfuse,我想以编程方式更改使用(以前是MacFUSE)实现的堆叠文件系统的卷图标。该图标需要反映已装入文件系统的状态 我一直在尝试的方法是将对/.VolumeIcon.icns的请求映射到应用程序包中的相应图标。然后向文件系统发送实际路径(path)和装载路径(mountPath)的更改通知 通过调试器,我可以看到这段代码被命中,但是映射/.VolumeIcon.icns的代码很少被调用,而且从来没有响应过这些通知。我认为简单的答案是,你运气不好。很长的答案是,虽然OSXFUSE项目与Fuse4X项目不

我想以编程方式更改使用(以前是MacFUSE)实现的堆叠文件系统的卷图标。该图标需要反映已装入文件系统的状态

我一直在尝试的方法是将对/.VolumeIcon.icns的请求映射到应用程序包中的相应图标。然后向文件系统发送实际路径(path)和装载路径(mountPath)的更改通知


通过调试器,我可以看到这段代码被命中,但是映射/.VolumeIcon.icns的代码很少被调用,而且从来没有响应过这些通知。

我认为简单的答案是,你运气不好。很长的答案是,虽然OSXFUSE项目与Fuse4X项目不同,但它们都来自同一个源,Fuse4X在其常见问题解答中对音量图标有这样的说法:

问题4.1。为什么Fuse4X卷显示为“服务器”(或“网络” 音量图标

答:准确地说,默认情况下,Fuse4X卷显示为非本地卷 不幸的是,查找程序将其视为“服务器”的卷。 为什么Fuse4X通常将其卷标记为 非本地的。有些人认为在基于磁盘的文件中 在系统中,Fuse4X必须将卷标记为本地卷。好吧,让我们看看

要使vfs在Mac OS X上是本地的,您需要一个“真正的”磁盘设备–一个 /dev/disk*样式节点。在Fuse4X的例子中,这样一个真实的磁盘设备节点 存在问题:在装载时,对于本地卷,内核将 自身打开设备节点并将其传递给Fuse4X。在这样做的过程中 内核将确保设备当前未被使用(例如 第一,禁止同一设备的多个安装)。这种情况会发生 在控制传递到Fuse4X并继续安装之前。这会 如果整个文件系统都在内核中,那么就没有问题了,但是 在Fuse4X的情况下,用户空间文件系统程序也希望 (独占)打开磁盘设备

看一看



是否尝试删除隐藏的.DS\u存储文件?我不确定这是否会影响图标。但无论如何,我都不愿意这样做,因为这意味着要删除用户选择的文件夹显示设置。@Aditya-我尝试了你的建议,但删除.DS_存储文件对桌面上显示的卷图标没有影响。NSWorkspace还有
设置图标:for文件:选项:
。我不知道它是否适用于坐骑。
    [[NSWorkspace sharedWorkspace] noteFileSystemChanged: @"/Volumes"]; 
    [[NSWorkspace sharedWorkspace] noteFileSystemChanged: [mountPath stringByDeletingLastPathComponent]];
    [[NSWorkspace sharedWorkspace] noteFileSystemChanged: mountPath];
    [[NSWorkspace sharedWorkspace] noteFileSystemChanged: [path stringByDeletingLastPathComponent]];
    [[NSWorkspace sharedWorkspace] noteFileSystemChanged: path];

    FNNotifyByPath([[[mountPath stringByDeletingLastPathComponent] dataUsingEncoding:NSUTF8StringEncoding] bytes], kFNDirectoryModifiedMessage, kNilOptions);
    FNNotifyByPath([[[path stringByDeletingLastPathComponent] dataUsingEncoding:NSUTF8StringEncoding] bytes], kFNDirectoryModifiedMessage, kNilOptions);
    FNNotifyByPath([[@"/Volumes" dataUsingEncoding:NSUTF8StringEncoding] bytes], kFNDirectoryModifiedMessage, kNilOptions);
- (BOOL)setAsCustomIconForVolume:(NString *)path;
{
    FSref FSRefpath = convertoFsref(path);
    // filename for custom icon is ".VolumeIcon.icns"
    NSString *iconPath = [path stringByAppendingPathComponent:@".VolumeIcon.icns"];

    // remove any existing file first.

    [self writeToFile:iconPath];
    FSSetHasCustomIcon(FSRefpath);

    // rebuild volumeList


    return YES;
}
OSErr FSSetHasCustomIcon(
                   const FSRef *ref)
{
    return ( FSChangeFinderFlags(ref, true, kHasCustomIcon) );
}
OSErr FSChangeFinderFlags(
                    const FSRef *ref,
                    Boolean setBits,
                    UInt16 flagBits)
{
    OSErr           result;
    FSCatalogInfo   catalogInfo;
    FSRef           parentRef;

    /* get the current finderInfo */
    result = FSGetCatalogInfo(ref, kFSCatInfoFinderInfo, &catalogInfo, NULL, NULL, &parentRef);
    require_noerr(result, FSGetCatalogInfo);

    /* set or clear the appropriate bits in the finderInfo.finderFlags */
    if ( setBits )
    {
        /* OR in the bits */
        ((FileInfo *)&catalogInfo.finderInfo)->finderFlags |= flagBits;
    }
    else
    {
        /* AND out the bits */
        ((FileInfo *)&catalogInfo.finderInfo)->finderFlags &= ~flagBits;
    }

    /* save the modified finderInfo */
    result = FSSetCatalogInfo(ref, kFSCatInfoFinderInfo, &catalogInfo);
    require_noerr(result, FSSetCatalogInfo);

FSSetCatalogInfo:
FSGetCatalogInfo:

        return ( result );
}