2010-01-05 3 views
10

durch Terminal Sie es mit einem Befehl machen - "SetFile -a B Dateiname"make mac Paket/bundle programmatisch

programmatisch ich glaube, ich eines der Attribute durch [[NSFileManager defaultManager] createDirectoryAtPath setzen soll dirpath withIntermediateDirectories: KEINE Attribute: Attribute error: nil];

aber ich kann nicht welche finden.

danke

Antwort

12

Es ist immer noch nützlich, das Bundle-Bit programmgesteuert setzen zu können, zum Beispiel iPhoto, damit der Ordner iPhoto Library als eine einzige Datei erscheint.

Sie können das Bundle-Bit programmgesteuert mithilfe der Carbon File Manager-API festlegen. Sie müssen sicherstellen, dass Ihre App mit dem Carbon-Framework verknüpft ist, und den Header <Carbon/Carbon.h> importieren. Diese Anrufe sind 64-Bit-sicher.

- (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; 
} 
4

Was versuchen Sie zu tun?

Fast alle Mac OS X Bundles sind eigentlich Ordner mit einem sehr spezifischen Layout von Dateien/Ordnern innerhalb. Selten ist ein Bündel nur eine Datei - sie existieren, aber nicht oft.

In den meisten Fällen ist das Bundle-Bit in der Datei völlig irrelevant.

i want to set a folder as a bundle. so through the file system it will looks like a file. later a want to open that package with my application. the question is how to set the folder bundle attribute through cocoa.

Sie müssen das Bundle-Bit wirklich nicht setzen. Solange Ihr Ordner eine Erweiterung hat (was er sollte) und Ihre Anwendung ist richtig konfiguriert, um Dateien/Ordner dieser Erweiterung zu öffnen, sollte es im Finder als ob es eine Datei wäre.

Beispiel:

  1. Zum ~/Desktop im Finder

  2. Im Terminal tun:

  3. cd ~/Desktop

  4. mkdir aafoo

  5. mv aafoo aafoo.rtfd

Nach (4), werden Sie im Finder als Ordner 'aafoo' sehen angezeigt.

Nach (5) wird 'aafoo' zu einem TextEdit-Dokument. Keine Attributbits notwendig.


OK - fair genug. Sie wollen wirklich wirklich etwas setzen.

Da Sie die Befehlszeile dazu haben, würde ich vorschlagen, einfach NSTask zu verwenden. Es wird wahrscheinlich einfacher sein, als eine API dafür zu verwenden.

+0

Ich möchte einen Ordner als Bündel festlegen. Durch das Dateisystem sieht es also wie eine Datei aus. später möchte ich dieses Paket mit meiner Bewerbung öffnen. Die Frage ist, wie Sie das Attribut des Ordnerbündels durch Kakao setzen. – Remizorrr

+0

ja. aber ich brauche keine Erweiterung. aber zum Beispiel fbp. Und ich muss es programmgesteuert machen. Um einen Ordner zu einem Bündel zu machen, können Sie einen Befehl über Terminal verwenden: SetFile -a B Ordnername. Man Seite für SetFile sagt - -a Attribute Setzt die Dateiattribute Bits wo ... (etc.) B | b Hat Bündel. die Frage ist, wie man das gleiche programmatisch durch Kakao machen. – Remizorrr

4

Sie setzen nicht ein Bündel Attribut. Sie definieren Ihre Dokumenttypen in der Info Ihrer Anwendung.plist file, und hier geben Sie an, ob es sich bei Ihrem Dokument um Pakete oder einfache Dateien handelt.

Sie können dies von Xcode aus tun, indem Sie "Get Info" auf Ihrem Anwendungsziel auswählen; Wechseln Sie zur Registerkarte "Eigenschaften" und fügen Sie unter "Dokumenttypen" ein Dokument hinzu, vergeben Sie einen Namen, legen Sie die Dateierweiterung fest, wählen Sie eine Symboldatei und aktivieren Sie das Kontrollkästchen "Paket".

+0

Damit dies funktioniert, müssen Sie sicherstellen, dass Ihre Dokumente in einer Bundle-Struktur gespeichert sind, wie hier beschrieben: http://developer.apple.com/mac/library/documentation/CoreFoundation/Conceptual/CFBundles/DocumentPackages/DocumentPackages .html # // apple_ref/doc/uid/10000123i-CH106-SW1 –

+0

Es gibt keinen Trick. Um den Artikel zu zitieren: "Alles, was Sie tun müssen, ist ein Verzeichnis mit der entsprechenden Dateinamenserweiterung zu erstellen." – Darren

+0

Ja, du hast Recht. –

2

Danke allen für die Hilfe. Ich habe die Lösung mit info.plist Datei verwendet. Dies ist der Teil der PLIST-Datei.

<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>