12 votos

Revertir la asociación de tipos de archivo

En ocasiones trabajo con paquetes de iTunes Music Store. Estos paquetes tienen un .itmsp extensión. Como .app , .itmsp es esencialmente un directorio contenedor. .itmsp contienen archivos XML y multimedia.

La última actualización de Xcode y/o Mac OS X (Xcode 4.6.1 en Mac OS 10.8.3) ha secuestrado la asociación del tipo de archivo para los directorios con el .itmsp extensión. Antes se trataban como carpetas normales, sin necesidad de hacer doble clic para ver su interior. Ahora, tengo que hacer doble clic en ellas para interactuar con ellas. Cuando lo hago, un programa llamado Application Loader intenta abrirlas. Para ver el interior tengo que hacer clic con el botón derecho y seleccionar "Mostrar contenido del paquete". Estoy tratando con miles de estos archivos en cualquier momento, así que eso no funciona.

He intentado cambiar o eliminar la asociación del tipo de archivo utilizando Get Info y RCDefaultApp. Ninguno de los dos funciona. La eliminación de la asociación de tipo de archivo simplemente convierte .itmsp directorios en archivos en blanco. Lo mismo ocurre si se borra el Application Loader.app por completo. En cualquier caso, sigo sin poder navegar por el contenido sin hacer clic con el botón derecho.

La respuesta anteriormente aceptada funcionó a las mil maravillas durante un tiempo: lsregister -u /Applications/Contents/Applications/Application\ Loader.app/ Ha dejado de funcionar desde que actualicé Xcode y/o Mac OS X. Si tienes Xcode instalado, deberías poder probarlo tú mismo nombrando un directorio foo.itmsp .

¿Cómo puedo hacer que .itmsp ¿los archivos se tratan de nuevo como carpetas?

11voto

Phill Puntos 126

El problema: las carpetas .itmsp se muestran como archivos

El Finder trata las carpetas .itmsp como paquetes Es decir, como si se tratara de un único archivo. Por ejemplo, en la vista de columna, todo lo que contiene la carpeta .itmsp es invisible, sólo se muestra el icono del documento:

enter image description here

El Finder considera que un directorio es un paquete si alguna de las siguientes condiciones es verdadera (desde el Guía de programación de paquetes ):

  1. El directorio tiene una extensión de nombre de archivo conocida: .app, .bundle, .framework, .plugin, .kext, etc. (como se define en /System/Library/CoreServices/CoreTypes.bundle/Contents/Info.plist . Este es un plist binario, ábrelo con Xcode: open -a Xcode Info.plist ).

  2. El directorio tiene una extensión que alguna otra aplicación afirma que representa un tipo de paquete (busque com.apple.package en la salida de mdls -name kMDItemContentTypeTree <foldername> para averiguarlo).

  3. El directorio tiene su bit de paquete activado (si GetFileInfo -ab <foldername> devuelve 1 ).

El caso 2. se aplica a las carpetas .itmsp: Application Loader.app tipo de exportaciones com.apple.itunes-producer.itmsp y lo ajusta a com.apple.package :

$ mkdir foo.itmsp
$ mdls -name kMDItemContentTypeTree foo.itmsp/
kMDItemContentTypeTree = (
    "com.apple.itunes-producer.itmsp",
    "com.apple.package",
    (...)
)
$ grep -B 5 -A 8 com.apple.package /Applications/Xcode.app/Contents/Applications/Application\ Loader.app/Contents/Info.plist 
    <key>UTExportedTypeDeclarations</key>
    <array>
        <dict>
            <key>UTTypeConformsTo</key>
            <array>
                <string>com.apple.package</string>
                <string>public.composite-content</string>
            </array>
            <key>UTTypeDescription</key>
            <string>iTunes Package</string>
            <key>UTTypeIconFile</key>
            <string>ITMSP.icns</string>
            <key>UTTypeIdentifier</key>
            <string>com.apple.itunes-producer.itmsp</string>

Una solución: volver a declarar el tipo com.apple.itunes-producer.itmsp

Una solución sería volver a declarar el tipo com.apple.itunes-producer.itmsp y extensión itmsp como carpeta y forzar a los Servicios de Lanzamiento a utilizar la declaración de tipo modificada.

Nota importante:

Aunque resuelve de forma fiable el problema del OP, la solución propuesta, cuando se aplica a otros paquetes, no los muestra como carpetas.

He descubierto que la solución propuesta parece funcionar sólo con los tipos de archivo declarados por las aplicaciones situadas en una ruta de aplicación no estándar.

Este es el caso de Application Loader.app que se encuentra en /Applications/Xcode.app/Contents/Applications/ .

Si estás interesado en una solución parcial consulta el final de esta respuesta.

Para que las carpetas .itmsp sean mostradas como carpetas por el Finder siga los siguientes pasos:

  1. Abra Automator en la carpeta de aplicaciones y seleccione Aplicación :

    enter image description here

  2. Seleccione Utilidades en la lista de la Biblioteca, seleccione Ejecutar Shell script y arrástrelo al panel de la derecha:

    enter image description here

  3. Sustituye el contenido por defecto de script por exit 0 :

    enter image description here

  4. Guarde la aplicación como itmspOpener:

    enter image description here

  5. Cerrar Automator.

  6. Seleccione itmspOpener.app y mostrar su contenido:

    enter image description here

  7. Localiza Contenido>Info.plist y ábrelo con tu editor favorito:

    enter image description here

  8. Sustituya estas secciones en Info.plist :

    <key>CFBundleDocumentTypes</key>
    <array>
        <dict>
            <key>CFBundleTypeExtensions</key>
            <array>
                <string>itmsp</string>
            </array>
            <key>CFBundleTypeName</key>
                <string>itmsp folder</string>
            <key>CFBundleTypeRole</key>
                <string>Viewer</string>
            <key>CFBundleTypeIconFile</key>
                <string>folder</string>
            <key>LSTypeIsPackage</key>
                <false/>
            <key>LSHandlerRank</key>
                <string>Owner</string>
        </dict>
    </array>
    (...)
    <key>UTExportedTypeDeclarations</key>
    <array>
        <dict>
            <key>UTTypeConformsTo</key>
            <array>
                <string>kUTTypeDirectory</string>
            </array>
            <key>UTTypeDescription</key>
            <string>itmsp folder</string>
            <key>UTTypeIconFile</key>
            <string>folder.icns</string>
            <key>UTTypeIdentifier</key>
            <string>com.apple.itunes-producer.itmsp</string>
            <key>UTTypeTagSpecification</key>
            <dict>
                <key>public.filename-extension</key>
                <string>itmsp</string>
            </dict>
        </dict>
    </array>

    Nota: Por qué kUTTypeDirectory en lugar de public.directory en UTExportedTypeDeclarations ? Desde Documentación de Apple : Importante: Cuando utilice UTIs definidos por el sistema en su código, debe utilizar las constantes definidas en UTCoreTypes.h en el marco de los servicios de lanzamiento cuando están disponibles, en lugar de las cadenas UTI reales. Por ejemplo, pase kUTTypeApplication en lugar de "com.apple.application". En "System-Declared Uniform Type Identifiers" se enumeran estas constantes además de las cadenas UTI.

  9. Asociar un archivo .itmsp a itmspOpener y pulse el botón Change All... :

    enter image description here

  10. Restablecer la base de datos de los Servicios de Lanzamiento:

    $ lsregister -kill -r -domain local -domain system -domain user

    (en OS X 10.8 lsregister se encuentra en /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/ .)

  11. Cree una carpeta .itmsp y liste sus propiedades:

    $ mkdir foo3.itmsp
    $ mdls -name kMDItemContentTypeTree foo3.itmsp/
    kMDItemContentTypeTree = (
        "public.folder",
        "public.directory",
        "public.item"
    )

    Debido a que la base de datos de los Servicios de Lanzamiento fue restablecida, ahora el Finder muestra las carpetas .itmsp como carpetas.

  12. Abrir itmspOpener.app para cargar su archivo plist y registrar com.apple.itunes-producer.itmsp :

    $ open ~/Desktop/itmspOpener.app
  13. Inicie Application Loader.app :

    $ open '/Applications/Xcode.app/Contents/Applications/Application Loader.app'

    Carpeta foo3.itmsp debería seguir apareciendo como una carpeta.

  14. Compruebe de nuevo las propiedades de la carpeta:

    $ mdls -name kMDItemContentTypeTree foo3.itmsp/
    kMDItemContentTypeTree = (
        "public.directory",
        "public.item",
        "public.content"
    )

    com.apple.package no se añadió a los atributos de metadatos de la carpeta, por eso el Finder sigue mostrando las carpetas .itmsp como carpetas.

Solución automatizada: mostrar las carpetas .itmsp como carpetas tras el inicio de sesión

Para mostrar las carpetas .itmsp como carpetas después del inicio de sesión:

  1. Crear itmspOpener.app y modificar su Info.plist como se ha descrito anteriormente.

  2. Crear /usr/local/bin/itmspTypeLoader con este contenido (la variable itmspOpener señala el lugar donde itmspOpener.app reside, cambiar si es necesario):

    #!/bin/bash
    
    itmspOpener="/Users/jaume/Applications/itmspOpener.app/"
    
    echo "$(date): Starting" > /tmp/itmspTypeLoader.log
    sleep 15
    echo "$(date): Deleting Launch Services database" >> /tmp/itmspTypeLoader.log
    /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister -kill -r -domain local -domain system -domain user >> /tmp/itmspTypeLoader.log
    sleep 15
    echo "$(date): Starting $itmspOpener" >> /tmp/itmspTypeLoader.log
    open $itmspOpener >> /tmp/itmspTypeLoader.log
    sleep 1
    echo "$(date): Starting Application Loader.app" >> /tmp/itmspTypeLoader.log
    open "/Applications/Xcode.app/Contents/Applications/Application Loader.app/"
    
    # Wait until process "Application Loader.app" exists
    while [ $(ps -ef|grep -v grep|grep -c "Application Loader") -ne 1 ]; do
        sleep 1
        echo "$(date): Waiting" >> /tmp/itmspTypeLoader.log
    done
    # Send TERM signal
    kill -TERM $(ps -ef|grep "Application Loader"|grep -v grep|awk "{print \$2}")
    if [ $? -eq 0 ]; then
        echo "$(date): Application Loader killed" >> /tmp/itmspTypeLoader.log
    else
        echo "$(date): Application Loader could not be killed" >> /tmp/itmspTypeLoader.log
    fi
    echo "$(date): Exiting" >> /tmp/itmspTypeLoader.log

    Ambos sleep 15 antes y después de correr lsregister son de suma importancia. Si no ve el resultado deseado, pruebe con otros retrasos.

  3. Crear /usr/local/bin/itmspTypeLoaderLauncher con este contenido:

    #!/bin/bash
    
    # $1 returns the short name of the user who is logging in
    su - $1 -c /usr/local/bin/itmspTypeLoader &
  4. Establecer ambos scripts ejecutables:

    $ sudo chmod a+x /usr/local/bin/itmspTypeLoader /usr/local/bin/itmspTypeLoaderLauncher 
  5. Establecer /usr/local/bin/itmspTypeLoaderLauncher como gancho de acceso :

    $ sudo defaults write com.apple.loginwindow LoginHook /usr/local/bin/itmspTypeLoaderLauncher
  6. Reinicie para que los cambios surtan efecto. Después de iniciar la sesión debería ver esto:

    enter image description here

    y lsregister -dump debe revelar que itmspOpener.app 's UTExportedTypeDeclarations tiene prioridad sobre Application Loader.app 's:

    $ lsregister -dump | less
    bundle  id:            24748
            path:          /Users/jaume/Desktop/itmspOpener.app/
            name:          itmspOpener
            (...)
            flags:         apple-internal  relative-icon-path  ui-element  has-min-sys-version-by-arch  hi-res-capable  user-can-change-hi-res-mode  
            item flags:    container  package  application  extension-hidden  native-app  scriptable  services  x86_64  
            (...)
            --------------------------------------------------------
            type    id:            33796
                    uti:           com.apple.itunes-producer.itmsp
                    description:   itmsp folder
                    flags:         exported  active  apple-internal  trusted  
                    icon:          Contents/Resources/folder.icns
                    conforms to:   kuttypedirectory
                    tags:          .itmsp
            --------------------------------------------------------
            (...)
    bundle  id:            24600
            path:          /Applications/Xcode.app/Contents/Applications/Application Loader.app/
            name:          Application Loader
            (...)
            flags:         apple-internal  relative-icon-path  hi-res-capable  user-can-change-hi-res-mode  
            item flags:    container  package  application  extension-hidden  native-app  i386  x86_64  
            (...)
            --------------------------------------------------------
            type    id:            33832
                    uti:           com.apple.itunes-producer.itmsp
                    description:   iTunes Package
                    flags:         exported  inactive  apple-internal  trusted  
                    icon:          Contents/Resources/ITMSP.icns
                    conforms to:   com.apple.package, public.composite-content
                    tags:          .itmsp
            --------------------------------------------------------

    ¿Ves el inactive bandera establecida en la exportación de tipo de Application Loader.app? Derrotamos a Application Loader.

La prueba de fuego: las carpetas .itmsp siguen apareciendo como tales tras la actualización de iTunes

Recientemente he actualizado Xcode:

enter image description here

y puedo confirmar que las carpetas .itmsp se mostraron como carpetas durante la actualización:

enter image description here

y después:

enter image description here

Una solución parcial: El paquete mostrará el contenido al hacer doble clic

Como se ha comentado anteriormente, el procedimiento detallado anteriormente no funcionará con carpetas arbitrarias que el Finder muestra como paquetes.

Sin embargo, si sólo quiere poder hacer doble clic en un paquete para abrirlo, hay una manera de hacerlo con un bash script y Automator:

  • El script crea una carpeta oculta y temporal dentro del paquete, la revela en el Finder (revelando así el paquete como una carpeta) y luego borra la carpeta temporal.

    Nota:

    El script podría en cambio crear un archivo oculto y temporal. Sin embargo, prefiero crear una carpeta porque rmdir sólo borra vacío carpetas, mientras que rm borra cualquier archivo, así que si, por alguna razón. el script hace estragos, sólo se borrarán las carpetas vacías, lo que probablemente no sea tan malo como si se borraran archivos.

  • Automator agrupa el script en una aplicación que se asociará a los archivos del paquete.

Estos son los pasos para crear una aplicación de este tipo. Utilizaré archivos .itmsp como ejemplo de tipo de paquete en la explicación que sigue:

  1. Abra Automator en la carpeta de aplicaciones y seleccione Aplicación :

    enter image description here

  2. Seleccione Servicios públicos en la lista de la Biblioteca, seleccione Ejecutar Shell script y arrástrelo al panel de la derecha:

    enter image description here

  3. Establecer Pasar la entrada a como argumentos :

    enter image description here

  4. Sustituye el contenido por defecto de script por esto:

    for f in "$@"; do
        # If not dealing with a directory, exit
        if [ ! -d "$f" ]; then exit; fi
        # Create a temporary directory inside the itmsp "file"
        tmpdir="$f/.itmspOpener$$"
        if mkdir $tmpdir; then
            # Reveal in Finder
            open -R $tmpdir
            # Delete temporary file
            rmdir $tmpdir
        fi
    done
  5. Guarde la aplicación como itmspOpener:

    enter image description here

  6. Cerrar Automator.

Ahora tienes una aplicación que puede abrir archivos .itmsp como carpetas si se asocian a ella.

Hay un problema cosmético: tal y como está, los archivos asociados tendrán el icono de documento blanco estándar:

enter image description here

Arreglemos esto también:

  1. Asegúrese de que Automator está cerrado.

  2. Seleccione itmspOpener y muestre su contenido:

    enter image description here

  3. Localiza Contenido>Info.plist y ábrelo con tu editor favorito:

    enter image description here

  4. Sustituir el valor de esta clave en el CFBundleDocumentTypes matriz:

    <key>CFBundleTypeName</key>
    <string>itmsp folder</string>

    y añadir esta clave:

    <key>CFBundleTypeIconFile</key>
    <string>folder</string>

    Ahora, la sección tiene este aspecto:

    enter image description here

  5. Cambie al Finder, seleccione una carpeta, pulse I seleccione el icono de la carpeta en la esquina superior izquierda y cópielo con C :

    enter image description here

  6. Abra la vista previa y seleccione Archivo>Nuevo desde el portapapeles. Guarde el archivo como folder.icns :

    enter image description here

  7. Copiar folder.icns a itmspOpener/Contents/Resources :

    enter image description here

  8. Asociar un archivo .itmsp a itmspOpener y pulse el botón Change All... :

    enter image description here

El icono de los archivos .itmsp debería cambiar a una carpeta, o al menos eso creía yo: por desgracia, no era así. Así que moví la aplicación itmspOpener a otra ubicación (creé una carpeta temporal en mi Escritorio, la moví allí y de nuevo a mi Escritorio). Eso refrescó la información del icono en el Finder:

enter image description here

Ahora haz doble clic en un archivo .itmsp y verás cómo se abre como una carpeta:

enter image description here

7voto

Una opción sería anular el registro del cargador de aplicaciones con lsregister -u /Applications/Xcode.app/Contents/Applications/Application\ Loader.app/ pero se registra de nuevo si se abre, si se reconstruye la base de datos de Launch Services, o posiblemente si se actualiza Xcode.

También puede comentar las entradas de los diccionarios CFBundleDocumentTypes y UTExportedTypeDeclarations en /Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/Info.plist y ejecutar lsregister -f /Applications/Xcode.app/Contents/Applications/Utilities/Application\ Loader.app/ . No invalida la firma del código de Xcode, pero los cambios podrían ser sobrescritos por las actualizaciones.

La ruta completa de lsregister es /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister en 10.5 y posteriores.

2voto

Old Pro Puntos 2851

Este es un extracto relevante de la página web de Apple documentación sobre los paquetes ( énfasis añadido )

Cómo identifica el sistema los lotes y paquetes

El Finder considera que un directorio es un paquete si se cumple alguna de las siguientes condiciones:

  • El directorio tiene una extensión de nombre de archivo conocida: .app, .bundle, .framework, .plugin, .kext, etc.
  • El directorio tiene una extensión que alguna otra aplicación afirma que representa un tipo de paquete; véase " Paquetes de documentos ."
  • El directorio tiene su bit de paquete activado.

La forma preferida de especificar un paquete es dar al directorio del paquete una extensión de nombre de archivo conocida. En la mayoría de los casos, Xcode se encarga de esto por ti proporcionando plantillas que apliquen la extensión correcta. Todo lo que tienes que hacer es crear un proyecto Xcode del tipo apropiado.

Es casi seguro que Xcode está representando que afirma .itmsp representa un tipo de paquete, como se describe en Paquetes de documentos . Así que tal vez la eliminación de esa extensión de Xcode Info.plist hará el truco, pero sospecho que una vez que esa asociación ha sido anotada por el Finder, eliminarla de Xcode no la deshará. ¿Cuáles son las "aplicaciones recomendadas" que te aparecen cuando haces clic con el botón derecho en "Abrir con..."? Tienes que comprobar todas sus Info.plists.

Le sugiero que vea si puede salirse con la suya utilizando lsregister -u para anular el registro de las aplicaciones que reclamaban .itmsp . De lo contrario, es posible que tenga que eliminar .itmsp de todos los plists y luego matar toda la base de datos de la asociación del buscador usando lsregister -kill -seed . Nunca hice eso, no se sabe cuánto daño hará al resto de su sistema. Probablemente quieras desregistrar, luego editar los plists, luego matar y resembrar la base de datos. No me sorprendería si unregister no borra la asociación si usted ha quitado del plist ya, y reseed lo agregará detrás adentro si usted no lo ha quitado todavía. Además, de esta manera usted no perderá todas las otras asociaciones para las aplicaciones infractoras.

Y lo que es peor, Xcode podría haber revisado y puesto el bit de bundle en todas las carpetas. Supongo que entonces tendrías que escribir un script usando GetFileInfo y SetFile para escanear el disco y deshacerlos, lo cual es un poco molesto, pero se puede hacer. Cruza los dedos para que los bits del paquete sigan sin estar activados. Utilice GetFileInfo para comprobarlo probando algunos.

0voto

moodforaday Puntos 2633

Creo que se puede arreglar esto usando

/usr/bin/SetFile -a B /path/to/file.itmsp

Pruébalo en uno antes de probarlo en todos los demás, obviamente.

Si necesitas que se ejecute en todos ellos en una carpeta determinada:

find . -name \*.itmsp -exec /usr/bin/SetFile -a B {} \;

debería hacerlo por ti.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X