сделайте пакет/пакет Mac программно

через терминал можно сделать его с командой - "имя файла SetFile-a B"

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

но я не могу найти который.

спасибо

10
задан Cory Foy 28 November 2010 в 01:49
поделиться

4 ответа

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

Вы можете программно установить бит пакета, используя API Carbon File Manager. Вам необходимо убедиться, что приложение подключено к каркасу Carbon и импортировать заголовок . Эти вызовы являются 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;
}
12
ответ дан 3 December 2019 в 17:59
поделиться

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

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

.
4
ответ дан 3 December 2019 в 17:59
поделиться

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

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

В большинстве случаев, бит пучка на архиве полностью не имеет значения.

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

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

Пример:

  1. Перейдите на ~/Desktop в Finder

  2. В терминале, сделайте:

  3. cd ~/Desktop

  4. mkdir aafoo

  5. mv aafoo aafoo.rtfd

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

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


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

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

.
4
ответ дан 3 December 2019 в 17:59
поделиться

Спасибо всем за помощь. Я использовал решение с файлом 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>
2
ответ дан 3 December 2019 в 17:59
поделиться