Сделать программный пакет/пакет mac

через терминал вы можете сделать это с помощью команды "SetFile -a B filename"

программно я думаю, что я должен установить один из атрибутов через [[NSFileManager defaultManager] createDirectoryAtPath: dirPath withIntermediateDirectories: NO атрибуты: атрибуты error: nil];

но я не могу найти, какой из них.

спасибо

Ответ 1

По-прежнему полезно иметь возможность устанавливать бит пакета программно, например, iPhoto делает это, чтобы папка iPhoto Library отображалась как один файл.

Вы можете установить бит пакета программно, используя API-интерфейс Carbon File Manager. Вам нужно будет убедиться, что ваши приложения связаны с каркасом 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;
}

Ответ 2

Что вы пытаетесь сделать?

Почти все пакеты Mac OS X представляют собой папки с очень специфическим расположением файлов/папок внутри. Редко это пучок только файла - они существуют, но не часто.

В большинстве случаев бит Bundle в файле совершенно не имеет значения.

Я хочу установить папку в виде пакета. поэтому через файловую систему он будет выглядеть как файл. позже захотите открыть этот пакет с моим приложением. вопрос заключается в том, как установить атрибут связки папок через cocoa.

Вам действительно не нужно устанавливать бит пакета. Пока ваша папка имеет расширение (которое должно быть), и ваше приложение правильно настроено для открытия файлов/папок этого расширения, оно должно засеваться в поисковом устройстве, как если бы это был файл.

Пример:

  • Перейдите к ~/Desktop in Finder

  • В терминале выполните:

  • cd ~/Desktop

  • mkdir aafoo

  • mv aafoo aafoo.rtfd

После (4) вы увидите "aafoo" в Finder как папку.

AFter (5), 'aafoo' изменится как документ TextEdit. Не требуется бит атрибута.


ОК - достаточно справедливо. Вы действительно хотите установить этот бит.

Учитывая, что у вас есть командная строка для этого, я бы предложил просто использовать NSTask. Скорее всего, это будет проще, чем использовать API для этого.

Ответ 3

Вы не устанавливаете атрибут связки. Вы определяете свои типы документов в вашем файле Info.plist приложения, и здесь вы указываете, являются ли ваши документы пакетами или обычными файлами.

Вы можете сделать это из Xcode, выбрав "Get Info" в своей целевой программе; перейдите на вкладку "Свойства", затем в разделе "Типы документов" добавьте документ, дайте ему имя, установите его расширение файла, выберите файл значка, затем отметьте галочку "Пакет".

Ответ 4

Спасибо всем за помощь. Я использовал решение с файлом 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>