2010-01-05 14 views
10

a través del terminal se puede hacer con un comando - "SetFile nombre -a B"hacer el paquete mac/paquete mediante programación

programación Creo que debería establecer uno de los atributos a través [[NSFileManager defaultManager] createDirectoryAtPath: DirPath withIntermediateDirectories: NO atributos: atributo error: nil];

pero no puedo encontrar cuál.

gracias

Respuesta

12

Aún es útil poder establecer el bit del paquete mediante programación, por ejemplo, iPhoto hace esto para que la carpeta iPhoto Library aparezca como un único archivo.

Puede establecer el bit del paquete programáticamente utilizando la API de Carbon File Manager. Deberá asegurarse de que la aplicación enlaza con el marco Carbon e importar el encabezado <Carbon/Carbon.h>. Estas llamadas son seguras a 64 bits.

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

¿Qué estás tratando de hacer?

Casi todos los paquetes de Mac OS X son en realidad carpetas con un diseño muy específico de archivos/carpetas. Rara vez un paquete es solo un archivo; existen, pero no a menudo.

En la mayoría de los casos, el bit Bundle en el archivo es completamente irrelevante.

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.

Realmente no necesita configurar el paquete de bits. Siempre que su carpeta tenga una extensión (que debería) y su aplicación esté configurada correctamente para abrir archivos/carpetas de esa extensión, debería aparecer en el buscador como si fuera un archivo.

Ejemplo:

  1. Ir a ~/Desktop en Finder

  2. En terminal, hacer:

  3. cd ~/Desktop

  4. mkdir aafoo

  5. mv aafoo aafoo.rtfd

Después (4), verá 'aafoo' aparece en Finder como una carpeta.

Después de (5), 'aafoo' cambiará para ser un documento TextEdit. No hay bits de atributo necesarios.


OK - suficiente. Realmente quieres establecer ese bit.

Dado que tiene la línea de comando para hacerlo, sugeriría simplemente usar NSTask. Es probable que sea más fácil que usar una API para hacerlo.

+0

quiero configurar una carpeta como un paquete. entonces a través del sistema de archivos se verá como un archivo. más tarde quiero abrir ese paquete con mi aplicación. la pregunta es cómo establecer el atributo del paquete de carpetas a través de cocoa. – Remizorrr

+0

sí. pero no necesito extensión rtfd. pero por ejemplo fbp. Y necesito hacerlo programáticamente. Para hacer que cualquier carpeta sea un paquete, puede usar un comando a través de la terminal: SetFile -a B foldername. página de manual para SetFile dice - -a atributos Establece los bits de atributos del archivo donde ... (etc.) B | b Tiene paquete. la pregunta es cómo hacer lo mismo programáticamente a través de cacao. – Remizorrr

4

No establece un atributo de paquete. Usted define sus tipos de documentos en la información de su aplicación.archivo plist, y aquí es donde especifica si los documentos son paquetes o archivos sin formato.

Puede hacer esto desde dentro de Xcode seleccionando "Obtener información" en su destino de aplicación; cambie a la pestaña "Propiedades", luego en "Tipos de documentos", añada un documento, asígnele un nombre, establezca su extensión de archivo, elija un archivo de icono y luego marque la marca de verificación "Paquete".

+0

Por supuesto, para que esto funcione, debe asegurarse de que sus documentos se guarden con una estructura de paquete, como se describe aquí: http://developer.apple.com/mac/library/documentation/CoreFoundation/Conceptual/CFBundles/DocumentPackages/DocumentPackages .html # // apple_ref/doc/uid/10000123i-CH106-SW1 –

+0

No hay truco para eso. Para citar el artículo: "todo lo que tienes que hacer es crear un directorio con la extensión de nombre de archivo adecuada". – Darren

+0

Sí, tienes razón. –

2

Gracias a todos por su ayuda. Usé la solución con el archivo info.plist. esta es la parte del archivo plist.

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