使用Cocoa在Finder中将文件夹挂载为设备

时间:2008-11-27 10:18:02

标签: cocoa macos applescript

有没有办法在Finder中将文件夹作为设备安装在硬盘上。这里打算为用户提供一种简单的方法来访问我的应用程序用来存储数据的文件夹。我不希望我的用户去搜索Application Data中的数据。我宁愿允许他们在Finder中将这些数据作为已安装的卷或设备提供。我也希望这个卷或设备是可读/写的,这样如果用户对数据文件进行任何更改,更改将反映在原始文件夹中。

有没有办法在可可,碳或苹果中做到这一点。

5 个答案:

答案 0 :(得分:4)

尝试查看FUSE。你可以使用各种伪造的文件系统。

但我会对你要做的事情提出一些警告。只需要一个按钮在应用程序中打开文件夹,而不是创建新设备,这可能更有意义。我个人会发现很难继续使用这样做的应用程序。它并不适合其他可用的应用程序。

您还可以使用别名指向Application Data目录。

答案 1 :(得分:1)

您可以使用稀疏磁盘映像创建“假”驱动器。

但为什么不在您的应用程序中配置数据目录呢?或者使用~/Documents/中的子目录?

桌面上的别名/符号链接将是最简单的解决方案:

ln -s '~/Application Data/Yourapp' '~/Desktop/Yourapp Data'

答案 2 :(得分:1)

我可以建议完全重新考虑吗?符号链接或别名可以工作,但是,如果可能的话,更好的想法是注册人们将移动到该文件夹​​的文件类型,然后通过移动或复制到正确的文件夹来响应打开它们。我正在考虑类似仪表板界面,如果你双击下载的.wdgt文件,它会询问你是否要“安装”小部件然后,如果你这样做,将它复制到〜/ Library / Widgets。显然,如果您正在处理图像,文件夹或通用文本文件等常见类型,这可能是不切实际的。

为了实现,您只需将文档类型添加到Info.plist中,并在App Delegate的-application:openFile:方法中处理它们。

答案 3 :(得分:0)

我也要求谨慎对待,对大多数用户来说似乎有点混乱。那就是说,您是否考虑过简单地创建相关目录的软链接?

答案 4 :(得分:0)

我使用NSWorkspace来做。在我的情况下,我使用函数 - (BOOL)isMountedPath;

进行初步检查

安装代码为:

    NSURL *path=[NSURL URLWithString:@"smb://server.resource/KEYS_DB"];
    if(NO==[self isMountedPath:[path absoluteString]])
    {
        NSWorkspace *ws=[NSWorkspace sharedWorkspace];
        [ws openURL:path];
    }

检查路径是否已挂载的代码是:

-(BOOL)isMountedPath:(NSString *)share
{
    NSArray * keys = @[NSURLVolumeURLForRemountingKey];
    NSArray * mountPaths = [[NSFileManager defaultManager] mountedVolumeURLsIncludingResourceValuesForKeys:keys options:0];

    NSError * error;
    NSURL * remount;

    for (NSURL * mountPath in mountPaths) {
        [mountPath getResourceValue:&remount forKey:NSURLVolumeURLForRemountingKey error:&error];
        if(remount){
            if ([[[NSURL URLWithString:share] host] isEqualToString:[remount host]] && [[[NSURL URLWithString:share] path] isEqualToString:[remount path]])
            {
                printf("Already mounted at %s\n", [[mountPath path] UTF8String]);
                return YES;
            }
        }
    }
    return NO;
}

其他可能有用的方法是:

-(NSString *)mountedPath:(NSString *)share
{
    NSArray * keys = @[NSURLVolumeURLForRemountingKey];
    NSArray * mountPaths = [[NSFileManager defaultManager] mountedVolumeURLsIncludingResourceValuesForKeys:keys options:0];

    NSError * error;
    NSURL * remount;

    for (NSURL * mountPath in mountPaths) {
        [mountPath getResourceValue:&remount forKey:NSURLVolumeURLForRemountingKey error:&error];
        if(remount){
            if ([[[NSURL URLWithString:share] host] isEqualToString:[remount host]] && [[[NSURL URLWithString:share] path] isEqualToString:[remount path]])
            {
                printf("Already mounted at %s\n", [[mountPath path] UTF8String]);
                return [mountPath path];
            }
        }
    }
    return nil;
}