2009-11-18 16 views
6

Solía ​​pensar que las carpetas necesitaban tener una extensión para que el Finder las reconociera como paquetes. Esa extensión se declarará en Info.plist de la aplicación propietaria.¿Cómo señalo una carpeta como un paquete?

Obviamente hay otra manera más elegante, pero no puedo entender cómo se hace.

E.g. iPhoto Library está siendo tratado como un paquete por el Finder. Sin embargo, no tiene extensión. mdls revela que efectivamente tiene "com.apple.package" en el árbol de tipos de contenido. El tipo de contenido real se asigna dinámicamente.

¿Cómo se dirigió iPhoto para crear dicho directorio?

Respuesta

7

Aunque no debe confiar únicamente en él, una cosa es establecer el bit del paquete del archivo. Tengo una categoría en NSWorkspace de hacer precisamente eso:

- (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 histórica: El bit de paquete se utilizó originalmente para archivos, y el hecho que el archivo tenía un recurso 'BNDL' en ella. El Buscador leería el recurso del paquete de cualquier archivo que haya encontrado que tenga el conjunto de bits establecido y no haya establecido el bit inited. Ahora, la función de los recursos 'BNDL' es satisfecha por los archivos Info.plist, y el bit del paquete se usa principalmente en directorios, donde le dice al Buscador y a los Servicios de Navegación que traten el directorio como lo harían con un archivo (es decir, hace el directorio un paquete). –

+0

¿Alguna razón en particular por la que pones esto en NSWorkspace? no usa el puntero "self" de NSWorkspace. – adib

+0

Me imagino que debería ser NSWorkspace o NSFileManager para que coincida con el resto de Cocoa. No puedo recordar por qué me decidí por el primero sin embargo. Es cierto que desde que se escribió este código, podría ser mejor en NSURL. –

2

El archivo y el protocolo son, según mi leal saber y entender, solo la configuración dentro de las aplicaciones Info.plist.

Las aplicaciones se escanean y la información en sus listas se agrega a la configuración de LaunchServices.

Linkinus tiene 6 tipos diferentes de documentos declarados, TextMate tiene 97 y CyberDuck tiene 3. Haré algunas búsquedas más, pero creo que este es probablemente el método preferido.

1

Hay dos comandos que pueden ser de interés:

GetFileInfo iPhoto\ Library 

attributes: avBstclinmedz 

El B dice que el bit de "paquete" está ajustado. El comando SetFile le permite configurarlos. Éstos le permiten acceder a los atributos extendidos en HFS + (según la página de manual).

Éstos son los posibles atributos:

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* 
Cuestiones relacionadas