如何将文件夹标记为包?

时间:2009-11-18 14:29:47

标签: cocoa

我曾经认为文件夹需要有一个扩展名,以便Finder将它们识别为包。该扩展将在拥有应用程序的Info.plist中声明。

显然还有另一种更优雅的方式,但我无法弄清楚它是如何完成的。

E.g。 Finder将iPhoto图库视为一个包。但它没有延伸。 mdls显示它确实在内容类型树中有“com.apple.package”。实际内容类型是动态分配的。

iPhoto如何创建这样的目录?

3 个答案:

答案 0 :(得分:7)

虽然你不应该单独依赖它,但要做的一件事就是设置文件的bundle位。我在NSWorkspace上有一个类别可以做到这一点:

- (void)setBundleBit:(BOOL)flag forFile:(NSString *)path
{
    FSRef fileRef;
    OSErr error = FSPathMakeRef((UInt8 *)[path fileSystemRepresentation], &fileRef, NULL);

    // Get the file's current info
    FSCatalogInfo fileInfo;
    if (!error)
    {
        error = FSGetCatalogInfo(&fileRef, kFSCatInfoFinderInfo, &fileInfo, NULL, NULL, NULL);
    }

    if (!error)
    {
        // Adjust the bundle bit
        FolderInfo *finderInfo = (FolderInfo *)fileInfo.finderInfo;
        if (flag) {
            finderInfo->finderFlags |= kHasBundle;
        }
        else {
            finderInfo->finderFlags &= ~kHasBundle;
        }

        // Set the altered flags of the file
        error = FSSetCatalogInfo(&fileRef, kFSCatInfoFinderInfo, &fileInfo);
    }

    if (error) {
        NSLog(@"OSError %i in -[NSWorkspace setBundleBit:forFile:]", error);
    }
}

答案 1 :(得分:2)

据我所知,文件和协议仅在您的应用Info.plist中设置。

应用程序会被扫描,并且其plist中的信息会添加到LaunchServices设置中。

Linkinus声明了6种不同的文档类型,TextMate有97种,而Cyber​​Duck有3种。我会做更多搜索,但我认为这可能是首选方法。

答案 2 :(得分:1)

有两个可能感兴趣的命令:

GetFileInfo iPhoto\ Library

attributes: avBstclinmedz

B表示设置了“捆绑”位。 SetFile命令允许您设置它们。这些允许您访问HFS +中的扩展属性(根据手册页)。

以下是可能的属性:

A   Alias file
B   Bundle
C   Custom icon*
D   Desktop*
E   Hidden extension*
I   Inited*
M   Shared (can run multiple times)
N   No INIT resources
L   Locked
S   System (name locked)
T   Stationery
V   Invisible*
Z   Busy*