через терминал можно сделать его с командой - "имя файла SetFile-a B"
программно я думаю, что должен установить один из атрибутов через [[NSFileManager defaultManager] createDirectoryAtPath:dirPath withIntermediateDirectories:NO attributes:attributes error:nil];
но я не могу найти который.
спасибо
По-прежнему полезно иметь возможность программной установки бита пакета, например, 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;
}
Вы не устанавливаете атрибут пакета. Вы определяете типы документов в файле Info.plist вашего приложения, и здесь вы указываете, являются ли документы пакетами или обычными файлами.
Это можно сделать из Xcode, выбрав "Получить информацию" в целевом приложении; переключитесь на вкладку "Свойства", затем в разделе "Типы документов" добавьте документ, дайте ему Имя, задайте расширение файла, выберите файл с иконкой, затем установите флажок "Пакет".
.Что вы пытаетесь сделать?
Почти все пучки Mac OS X фактически папки с очень специфическим расположением архивов/папок внутри. Редко пучок как раз архива -- они существуют, но не часто.
В большинстве случаев, бит пучка на архиве полностью не имеет значения.
я хочу установить папку как пучок. так через файловую систему она будет выглядеть как архив. более поздно желание открыть тот пакет с моим приложением. вопрос как установить атрибут пучка папок через какао.
Вам действительно не нужно установить бит пучка. Пока ваша папка имеет расширение (которое она должна) и ваше приложение правильно настроено на открытие файлов/папок этого расширения, оно должно посеять в поисковике, как если бы это был файл.
Пример:
Перейдите на ~/Desktop в Finder
В терминале, сделайте:
cd ~/Desktop
mkdir aafoo
mv aafoo aafoo.rtfd
После (4), вы увидите 'aafoo' в Finder в виде папки.
AFter (5), 'aafoo' изменится на TextEdit документ. Никаких битов атрибута не требуется.
OK -- достаточно справедливо. Вы действительно хотите установить этот бит.
Учитывая, что у вас есть командная строка для этого, я бы посоветовал просто использовать NSTask. Скорее всего, это будет проще, чем использовать API.
.Спасибо всем за помощь. Я использовал решение с файлом 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>