2009-11-18 19 views
6

Ero solito pensare che le cartelle dovessero avere un'estensione in modo che fossero riconosciute come pacchetti dal Finder. Tale estensione verrebbe dichiarata nel file Info.plist dell'applicazione proprietaria.Come si contrassegna una cartella come un pacchetto?

Ovviamente c'è un altro, più elegante modo, ma non riesco a capire come è fatto.

E.g. la libreria iPhoto viene considerata come un pacchetto dal Finder. Eppure non ha estensione. mdls rivela che ha effettivamente "com.apple.package" nell'albero dei tipi di contenuto. Il tipo di contenuto effettivo viene assegnato dinamicamente.

In che modo iPhoto è riuscito a creare tale directory?

risposta

7

Sebbene non si debba fare affidamento esclusivamente su di esso, una cosa da fare è impostare il bit di bundle del file. Ho una categoria a NSWorkspace a fare proprio questo:

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

Nota storica: il bit fascio è stato originariamente utilizzato per i file, e ha fatto sì che il file ha avuto una risorsa 'BNDL' in esso. Il Finder leggeva la risorsa bundle da qualsiasi file che incontrava che aveva il set di bundle bit e non aveva il bit bit impostato. Ora, la funzione delle risorse 'BNDL' è soddisfatta dai file Info.plist, e il bit del bundle viene principalmente utilizzato nelle directory, dove dice al Finder e ai servizi di navigazione di trattare la directory come farebbe con un file (cioè, rende directory un pacchetto). –

+0

Qualche ragione particolare per cui lo metti su NSWorkspace? non usa il puntatore "self" di NSWorkspace. – adib

+0

Immagino che dovrebbe essere NSWorkspace o NSFileManager in modo che corrisponda al resto di Cocoa. Non riesco a ricordare perché ho optato per il primo però. Certo, dal momento che questo codice è stato scritto, potrebbe essere meglio su NSURL. –

2

File e protocollo sono, per quanto ne so, solo l'installazione all'interno delle vostre app Info.plist.

Le applicazioni vengono scansionate e le informazioni nei loro elenchi vengono aggiunte alle impostazioni di LaunchServices.

Linkinus ha 6 diversi tipi di documento dichiarati, TextMate ha 97 e CyberDuck ne ha 3. Farò qualche altra ricerca ma penso che questo sia probabilmente il metodo preferito.

1

Ci sono due comandi che possono essere di interesse:

GetFileInfo iPhoto\ Library 

attributes: avBstclinmedz 

Il B dice che il bit "pacchetto" è impostato. Il comando SetFile consente di impostarli. Questi ti permettono di accedere agli attributi estesi in HFS + (secondo la pagina man).

Ecco i possibili attributi:

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* 
Problemi correlati