有没有办法将硬盘上的文件夹作为 Finder 中的设备挂载。这里的目的是为用户提供一种简单的方法来访问我的应用程序用来存储数据的文件夹。我不希望我的用户在应用程序数据中搜索数据。我宁愿让他们在 Finder 中将这些数据作为已安装的卷或设备提供。我还希望这个卷或设备可以读/写,这样如果用户对数据文件进行任何更改,更改将反映在原始文件夹中。
有没有办法在可可、碳或苹果脚本中做到这一点。
有没有办法将硬盘上的文件夹作为 Finder 中的设备挂载。这里的目的是为用户提供一种简单的方法来访问我的应用程序用来存储数据的文件夹。我不希望我的用户在应用程序数据中搜索数据。我宁愿让他们在 Finder 中将这些数据作为已安装的卷或设备提供。我还希望这个卷或设备可以读/写,这样如果用户对数据文件进行任何更改,更改将反映在原始文件夹中。
有没有办法在可可、碳或苹果脚本中做到这一点。
尝试查看 FUSE。你可以拥有各种伪文件系统。
但我会提醒您注意您正在尝试做的事情。在您的应用程序中只使用一个打开文件夹的按钮可能更有意义,而不是创建一个新设备。我个人会发现很难继续使用执行此类操作的应用程序。它并不真正适合其他可用的应用程序。
您还可以使用别名来指向您的应用程序数据目录。
我可以建议完全重新考虑这一点吗?符号链接或别名会起作用,但如果可能,更好的主意是注册人们将移入该文件夹的文件类型,然后通过将它们移动或复制到正确的文件夹来响应打开它们。我正在考虑类似仪表板界面的东西,如果您双击下载的 .wdgt 文件,它会询问您是否要“安装”小部件,然后,如果您愿意,请将其复制到 ~/Library/Widgets。显然,如果您处理的是图像、文件夹或通用文本文件等常见类型,这可能是不切实际的。
为了实现,您只需将文档类型添加到您的 Info.plist,并在您的 App Delegate 的 -application:openFile: 方法中处理它们。
您可以使用稀疏磁盘映像来创建“假”驱动器。
但是为什么不在你的应用程序中配置数据目录呢?或者使用子目录~/Documents/
?
桌面上的别名/符号链接将是最简单的解决方案:
ln -s '~/Application Data/Yourapp' '~/Desktop/Yourapp Data'
我还敦促对此保持谨慎,这对大多数用户来说似乎有些混乱。也就是说,您是否考虑过简单地创建一个指向相关目录的软链接?
我使用 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;
}