2009-11-18 13 views
6

Ich dachte früher, dass Ordner eine Erweiterung haben müssen, damit sie vom Finder als Pakete erkannt werden. Diese Erweiterung wird in der Info.plist der besitzenden Anwendung deklariert.Wie kennzeichne ich einen Ordner als Paket?

Offensichtlich gibt es einen anderen, eleganteren Weg, aber ich kann nicht herausfinden, wie es gemacht wird.

z. Die iPhoto-Bibliothek wird vom Finder als Paket behandelt. Aber es hat keine Erweiterung. mdls enthüllt, dass es tatsächlich "com.apple.package" in der Inhaltstyp-Baumstruktur hat. Der tatsächliche Inhaltstyp wird dynamisch zugewiesen.

Wie hat iPhoto ein solches Verzeichnis erstellt?

Antwort

7

Obwohl Sie sich nicht ausschließlich darauf verlassen sollten, müssen Sie das Bundle-Bit der Datei setzen. Ich habe eine Kategorie NSWorkspace bekommt, genau das zu tun:

- (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); 
    } 
} 
+2

Historische Anmerkung: Das Bündel Bit ursprünglich für Dateien verwendet wurde, und bedeutet, dass die Datei in eine ‚BNDL‘ Ressource hatte. Der Finder würde die Bündelressource von jeder Datei lesen, die er gefunden hat und bei der das Bundle-Bit gesetzt war und das Bit nicht gesetzt war. Jetzt wird die Funktion von 'BNDL' Ressourcen von Info.plist Dateien erfüllt, und das Bundle Bit wird hauptsächlich in Verzeichnissen verwendet, wo es den Finder und die Navigationsdienste anweist, das Verzeichnis wie eine Datei zu behandeln (dh es macht das Verzeichnis ein Paket). –

+0

Irgendein besonderer Grund, warum Sie dies auf NSWorkspace setzen? Es verwendet den "self" -Zeiger von NSWorkspace nicht. – adib

+0

Ich denke, es sollte entweder NSWorkspace oder NSFileManager sein, um dem Rest von Cocoa zu entsprechen. Ich kann mich nicht erinnern, warum ich mich für das Erste entschieden habe. Zugegeben, seit dieser Code geschrieben wurde, könnte es auf NSURL besser sein. –

2

Datei und Protokoll werden nach bestem Wissen nur in Ihrer App Info.plist eingerichtet.

Apps werden gescannt und die Informationen in ihren Plisten werden zu den LaunchServices-Einstellungen hinzugefügt.

Linkinus hat 6 verschiedene Dokumenttypen deklariert, TextMate hat 97, und CyberDuck hat 3. Ich werde noch mehr suchen, aber ich denke, das ist wahrscheinlich die bevorzugte Methode.

1

Es gibt zwei Befehle, die von Interesse sein können:

GetFileInfo iPhoto\ Library 

attributes: avBstclinmedz 

Die B sagt, dass das „Bündel“ Bit gesetzt ist. Mit dem Befehl SetFile können Sie sie festlegen. Damit haben Sie Zugriff auf die erweiterten Attribute in HFS + (pro Man-Page).

Hier sind die möglichen Attribute:

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* 
Verwandte Themen