2009-11-18 6 views
6

Je pensais que les dossiers devaient avoir une extension afin qu'ils soient reconnus comme des paquets par le Finder. Cette extension sera déclarée dans Info.plist de l'application propriétaire.Comment marquer un dossier comme étant un paquet?

Évidemment, il y a une autre façon, plus élégante, mais je n'arrive pas à comprendre comment cela est fait.

E.g. la photothèque iPhoto est traitée comme un paquet par le Finder. Pourtant, il n'a pas d'extension. mdls révèle qu'il a en effet "com.apple.package" dans l'arborescence du type de contenu. Le type de contenu réel est attribué dynamiquement.

Comment iPhoto est-il parvenu à créer un tel répertoire?

Répondre

7

Bien que vous ne deviez pas compter uniquement sur elle, une chose à faire est de définir le bit bundle du fichier. J'ai une catégorie sur NSWorkspace pour le faire que:

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

Note historique: Le bit bundle a été utilisé pour les fichiers, et signifie que le fichier avait une ressource « BNDL » en elle. Le Finder lirait la ressource du bundle à partir de tout fichier rencontré dont le bit du bundle était défini et dont le bit initial n'était pas défini. Maintenant, la fonction des ressources 'BNDL' est remplie par les fichiers Info.plist, et le bit bundle est principalement utilisé sur les répertoires, où il indique au Finder et aux services de navigation de traiter le répertoire comme ils le feraient pour un fichier (c.-à-d. répertoire un paquet). –

+0

Une raison particulière pourquoi mettez-vous cela sur NSWorkspace? il n'utilise pas le pointeur "self" de NSWorkspace. – adib

+0

Je me dis que ce devrait être NSWorkspace ou NSFileManager pour faire correspondre le reste de Cocoa. Je ne me souviens pas pourquoi je me suis installé sur le premier. Certes, depuis que ce code a été écrit, il pourrait être mieux sur NSURL. –

2

Le fichier et le protocole sont, pour autant que je sache, uniquement configurés dans votre répertoire Info.plist.

Les applications sont numérisées et les informations dans leurs listes sont ajoutées aux paramètres LaunchServices. Linkinus a 6 différents types de documents déclarés, TextMate a 97, et CyberDuck a 3. Je ferai plus de recherche mais je pense que c'est probablement la méthode préférée.

1

Il y a deux commandes qui peuvent vous intéresser:

GetFileInfo iPhoto\ Library 

attributes: avBstclinmedz 

Le B dit que le bit « bundle » est réglé. La commande SetFile vous permet de les définir. Ceux-ci vous permettent d'accéder aux attributs étendus dans HFS + (par la page man).

Voici les attributs possibles:

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* 
Questions connexes