通过终端你可以使用命令 - “SetFile -a B filename”
以编程方式我认为我应该设置其中一个属性 [[NSFileManager defaultManager] createDirectoryAtPath:dirPath withIntermediateDirectories:NO attributes:attributes error:nil];
但我找不到哪一个。
感谢
答案 0 :(得分:12)
能够以编程方式设置捆绑位仍然很有用,例如iPhoto执行此操作以使 iPhoto Library 文件夹显示为单个文件。
您可以使用Carbon File Manager API以编程方式设置捆绑位。您需要确保您的应用链接到Carbon框架并导入<Carbon/Carbon.h>
标头。这些调用是64位安全的。
- (void)setBundleBitOfFile:(NSString*)path toBool:(BOOL)newValue
{
const char* pathFSR = [path fileSystemRepresentation];
FSRef ref;
OSStatus err = FSPathMakeRef((const UInt8*)pathFSR, &ref, /*isDirectory*/ NULL);
if (err == noErr)
{
struct FSCatalogInfo catInfo;
union FinderInfoTransmuter finderInfoPointers = { .bytes = catInfo.finderInfo };
err = FSGetCatalogInfo(&ref,
kFSCatInfoFinderInfo,
&catInfo,
/*outName*/ NULL,
/*FSSpec*/ NULL,
/*parentRef*/ NULL);
if (err == noErr)
{
if (newValue)
finderInfoPointers.finderInfo->finderFlags |= kHasBundle;
else
finderInfoPointers.finderInfo->finderFlags &= ~kHasBundle;
FSSetCatalogInfo(&ref,
kFSCatInfoFinderInfo,
&catInfo);
}
}
}
- (BOOL)bundleBitOfFile:(NSString*)path
{
BOOL value = NO;
const char* pathFSR = [path fileSystemRepresentation];
FSRef ref;
OSStatus err = FSPathMakeRef((const UInt8*)pathFSR, &ref, /*isDirectory*/ NULL);
if (err == noErr)
{
struct FSCatalogInfo catInfo;
union FinderInfoTransmuter finderInfoPointers = { .bytes = catInfo.finderInfo };
err = FSGetCatalogInfo(&ref,
kFSCatInfoFinderInfo,
&catInfo,
/*outName*/ NULL,
/*FSSpec*/ NULL,
/*parentRef*/ NULL);
if (err == noErr)
{
value = (BOOL)(((finderInfoPointers.finderInfo->finderFlags) & kHasBundle) == kHasBundle);
}
}
return value;
}
答案 1 :(得分:4)
你想做什么?
几乎所有Mac OS X捆绑包实际上都是文件夹,其中包含非常特定的文件/文件夹布局。很少是捆绑只是一个文件 - 它们确实存在,但不常见。
在大多数情况下,文件上的Bundle位完全不相关。
我想将文件夹设置为捆绑包。所以通过文件系统它看起来像一个文件。后来我想用我的应用程序打开那个包。问题是如何通过cocoa设置文件夹包属性。
你真的不需要设置捆绑位。只要您的文件夹有一个扩展名(它应该)并且您的应用程序已正确配置为打开该扩展名的文件/文件夹,它应该在查找器中播放,就像它是一个文件一样。
示例:
在Finder中转到〜/ Desktop
在终端中,执行:
cd ~/Desktop
mkdir aafoo
mv aafoo aafoo.rtfd
在(4)之后,你会看到'aafoo'在Finder中显示为一个文件夹。
在(5)之后,'aafoo'将变为TextEdit文档。没有必要的属性位。
好的 - 足够公平。你真的很想设置那一点。
鉴于你有命令行来做,我建议只使用NSTask。这可能比使用API更容易。
答案 2 :(得分:4)
您没有设置捆绑属性。您可以在应用程序的Info.plist文件中定义文档类型,然后在此处指定文档是包还是普通文件。
您可以在Xcode中通过在应用程序目标上选择“获取信息”来执行此操作;切换到“属性”选项卡,然后在“文档类型”下添加文档,给它一个名称,设置其文件扩展名,选择一个图标文件,然后选中“包”复选标记。
答案 3 :(得分:2)
感谢大家的帮助。我使用了info.plist文件的解决方案。 这是plist文件的一部分。
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeName</key>
<string>Project</string>
<key>LSHandlerRank</key>
<string>Default</string>
<key>LSTypeIsPackage</key>
<true/>
<key>CFBundleTypeExtensions</key>
<array>
<string>fbp</string>
</array>
<key>CFBundleTypeIconFile</key>
<string>document</string>
<key>CFBundleTypeRole</key>
<string>Editor</string>
</dict>
</array>