是否可以以编程方式更改Mac OS X上已安装驱动器上的音量图标?

Bri*_*ews 12 macos objective-c macfuse

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

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

    [[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);
Run Code Online (Sandbox Code Playgroud)

单步执行调试器,我可以看到此代码被命中,但映射/.VolumeIcon.icns的代码很少被调用,并且从不响应这些通知.

syn*_*tel 3

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

\n\n
\n

问 4.1。为什么 Fuse4X 卷显示有“服务器”(或“网络\n 卷”)图标?

\n\n

答:准确地说,默认情况下,Fuse4X 卷显示为非本地卷,遗憾的是 Finder 将其视为“服务器”。这是一个很好的问题,为什么 Fuse4X 通常将其卷标记为非本地卷。有些人认为,对于基于磁盘的文件系统,Fuse4X 必须将卷标记为本地。好吧,让我们看看。

\n\n

对于 Mac OS X 上的本地 vfs,您需要一个“真正的”磁盘设备 \xe2\x80\x93 a\n /dev/disk* 样式节点。Fuse4X 中的这种真实磁盘设备节点是有问题的:在挂载时,对于本地卷,内核会自行打开设备节点并将其传递给 Fuse4X。这样做时,内核将确保该设备当前未在使用中(其中之一是不允许多次挂载同一设备)。这发生在控制权传递给 Fuse4X 并可以继续安装之前。如果整个文件系统位于内核中,这本来就很好,但在 Fuse4X 的情况下,用户空间文件系统程序也想(独占)打开磁盘设备。

\n
\n