【发布时间】:2011-01-12 09:05:59
【问题描述】:
是否有任何 Cocoa 或 Carbon API 来设置打开文件的默认应用程序? 即如果我选择一个文件并执行 Cmd+i,我们会得到一个选项“打开方式”。在这里我们可以设置默认应用打开文件。此外,还有一个选项可以将其应用于所有此类文件。
如何以编程方式实现这两个目标?
【问题讨论】:
是否有任何 Cocoa 或 Carbon API 来设置打开文件的默认应用程序? 即如果我选择一个文件并执行 Cmd+i,我们会得到一个选项“打开方式”。在这里我们可以设置默认应用打开文件。此外,还有一个选项可以将其应用于所有此类文件。
如何以编程方式实现这两个目标?
【问题讨论】:
基于每个文件设置应用程序的 API 是私有的。有关设置处理文件类型的应用程序,请参阅启动服务参考中的 LSSetDefaultRoleHandlerForContentType 和其他方法。
【讨论】:
要为文件扩展名(或文件 UTI)设置默认应用程序,请在此处查看我的答案:https://stackoverflow.com/a/8645445/272342
【讨论】:
有一个 Carbon API 可以实现这一点,请参阅Resource Manager Reference。您必须为要使用特定应用程序打开的文件创建资源分支,并添加这样的资源(非常快速和肮脏的代码):
FSRef theFsRef;
CFURLRef url = (__bridge CFURLRef)[NSURL fileURLWithPath:path];
CFURLGetFSRef(url, &theFsRef);
HFSUniStr255 fork = {0,{0}};
FSGetResourceForkName(&fork);
Handle theResHandle;
ResFileRefNum theRefFile;
ResType rType = 'usro';
ResID rID = 0;
NSMutableData *aData = [[NSMutableData alloc] init];
Byte buf[4] = {0x1A, 0x00, 0x00, 0x00};
[aData appendData:[NSData dataWithBytes:&buf length:sizeof(buf)]];
NSData *bData = [@"/Applications/Firefox.app" dataUsingEncoding:NSUTF8StringEncoding];
[aData appendData:bData];
int len = 4 + [bData length];
[aData appendData:[NSMutableData dataWithLength:(1028-len)]];
PtrToHand ([aData bytes], &theResHandle, [aData length]);
FSCreateResourceFork(&theFsRef,fork.length,fork.unicode,0);
FSOpenResourceFile(&theFsRef,fork.length,fork.unicode,fsRdWrPerm,&theRefFile);
AddResource(theResHandle, rType, rID, "\p");
WriteResource(theResHandle);
ReleaseResource(theResHandle);
UpdateResFile(theRefFile);
CloseResFile(theRefFile);
【讨论】: