Haga que Windows trate los archivos con la misma extensión de manera diferente

10

Varios programas usan la misma extensión de archivo, pero los formatos son totalmente diferentes e incompatibles. Por ejemplo, tengo .scharchivos en mi computadora que están en al menos 5 formatos diferentes (TINA, PSpice, PADS, Protel y Eagle). ¿Hay alguna manera de hacer que Windows los trate de manera diferente, de modo que al hacer doble clic en dicho archivo se abra en el programa en el que está destinado a abrirse?

Linux usa números mágicos en los propios archivos para diferenciar, y solo usa extensiones de archivos como un plan alternativo. (Todos los archivos PNG comienzan con los bytes 89 50 4E 47 0D 0A 1A 0A , por ejemplo, independientemente de cómo los nombre). Sería bueno si Windows pudiera admitir esto, pero probablemente sea muy difícil de implementar. ¿Quizás algo más simple como una extensión de segundo nivel, como filename.program1.schy filename.program2.sch? ¿Quizás algún tipo de filtro que cambie el nombre de los archivos sobre la marcha?

Mejor idea: ¿asociar la extensión ambigua con un preprocesador (archivo .bat o aplicación dedicada) que verifica si hay una extensión de segundo nivel o va al archivo mismo y busca el número mágico y luego lanza el programa apropiado?

endolito
fuente
1
TrID puede ser de su interés: tiene una base de datos de 4400 firmas binarias.
josh3736
Recuerdo que esto solía ocurrir en el sistema operativo RISC, pero a veces causaba frustración cuando tenía múltiples aplicaciones que podían procesar el mismo tipo de archivo y ¡abría el programa con el programa incorrecto!
Matt Wilko el
@ Matt: ¡Genial, gracias! file-extension.net/seeker/file_extension_sch
endolith

Respuestas:

9

Windows no inicia archivos basados ​​en ninguna información del archivo; crear una base de datos para eso requeriría una increíble cantidad de trabajo y programación. La única forma verdadera de identificar un archivo es mediante las firmas binarias en el archivo, si el archivo lo tiene, y esto depende del autor del software implementarlo.

En Windows, los archivos se pasan al programa que especifique para una extensión de archivo en particular. Windows determina la extensión de un archivo como la subcadena que sigue a la última aparición de un período, por lo que no es posible con los nombres de archivo que publicó.

Debe cambiar el nombre de los archivos (y darles extensiones de archivo únicas) o escribir un archivo por lotes para iniciar la aplicación adecuada para usted. Para más detalles, vea este artículo de Technet .

Penetración
fuente
1
Estaba tratando de hacer que esto funcionara creando una extensión de archivo única, pero incluso si lo hizo, el verdadero problema es que la mayoría de los programas solo reconocerán sus propias extensiones a pesar del contenido, y no las abrirían de todos modos.
KCotreau
2
Sin embargo, me encantaría ver a alguien hacer esto. Creo que la forma de evitarlo es tener un solo programa que abra los archivos de todas las extensiones, y que ese programa mantenga su propia base de datos (utilizando las secuencias alternativas de NTFS para realizar un seguimiento de los archivos) y ejecute cada programa respectivo que el usuario defina para cada archivo No sería que mucho trabajo, pero puedo ver una gran cantidad de problemas con este enfoque, por lo que probablemente es por qué nadie lo ha hecho.
Sasha Chedygov
2
no sería DEMASIADO difícil: hay herramientas que lo hacen (trid o archivo) y la mayoría de los oses basados ​​en posix miran los encabezados de los archivos y no las extensiones. Es menos una cuestión de opciones de diseño, que la cantidad de esfuerzo que tomaría. Naturalmente, esto sería mucho más difícil para un tercero, pero si MS considera que es necesario, esto podría ser semi trivial
Journeyman Geek
3
"Uso de las secuencias alternativas de NTFS para realizar un seguimiento de los archivos". Para mí es obvio por qué Windows no implementa el modelo Linux / POSIX. Simplemente que requiere una lectura de archivo. Si ese fuera el caso, cada vez que hace clic derecho en un archivo, tiene que disparar una lectura de archivo costosa. Peor aún, imagine si se tratara de un archivo de red y la conexión tuviera un retraso notable. La gente simplemente culparía a WinDoze. Raymond Chen criticaría esta técnica también porque provocaría que un archivo fuera retirado del mercado si estaba en un área de almacenamiento terciario.
Surfasb
1
Pero Windows le permite romper ese modelo. . .
Surfasb
8

Lo resolví yo mismo:

Hice un script de Python que lee los primeros bytes de un archivo y los compara con un diccionario, luego lanza el programa apropiado basado en los números mágicos.

import sys
import subprocess

magic_numbers = {
'OB': r'C:\Program Files (x86)\DesignSoft\Tina 9 - TI\TINA.EXE', # TINA
'*v': r'C:\Program Files (x86)\Orcad\Capture\Capture.exe', #PSpice
'DP': r'C:\Program Files (x86)\Design Explorer 99 SE\Client99SE.exe', #Protel
'\x00\xFE': r'C:\MentorGraphics\9.0PADS\SDD_HOME\Programs\powerlogic.exe', #PADS Logic
'\x10\x80': r'C:\Program Files (x86)\EAGLE-5.11.0\bin\eagle.exe', # Eagle
}

filename = sys.argv[1]
f = open(filename, 'rb')
# Read just enough bytes to match the keys
magic_n = f.read(max(map(len, magic_numbers)))

subprocess.call([magic_numbers[magic_n], filename])

La última versión estará aquí: inicie archivos ambiguos en el programa apropiado

Traté de asociar la extensión del archivo con este script, pero Windows 7 no me lo permitió. Simplemente lo asoció con Python, así que entré en el registro y agregué el nombre del script manualmente.

Cómo asociar una extensión de archivo con un script de Python

Espacio para mejorar, pero funciona. Puedo hacer doble clic en diferentes archivos con la misma extensión .sch y se abren en diferentes aplicaciones.

Actualización: lo he convertido a un .exe usando cx_freeze, con un archivo de configuración externo YAML, y es fácil de asociar. Ver también esta propuesta de libmagic . No estoy seguro de si debería convertir esto en un completo "lanzador de libmagic para Windows" o si es mejor manejar solo una extensión de archivo con un .exe y un simple archivo YAML.

endolito
fuente
2
Esto sería realmente trivial para escribir como un exe. . .
Surfasb
No, si no sabes cómo escribir exes :)
endolith
1
No fue un golpe para ti. Fue algo para mí :)
surfasb 02 de
@surasb: ¿Me has escrito un .exe todavía? Es trivial, ¿verdad? :)
endolith
¡Lo olvidé totalmente! He estado jugando con mallas 3D en Silverlight durante la semana pasada. Más tarde esta noche, después de cuidar a este conjunto RAID. . .
surfasb
3

Para comenzar, puede cambiar el nombre de uno de los tipos de archivos para que tenga una nueva extensión, y usar el diálogo "abrir con" para configurar un programa predeterminado para abrir esos tipos de archivos.

Sin embargo, esto no se ocupa del problema de cambio de nombre. Pero simplifica las cosas creando una carpeta específica donde coloca todos los archivos de uno de los programas. Luego, puede escribir una secuencia de comandos para cambiar automáticamente el nombre de los archivos de esa carpeta a su nueva extensión de archivo.

Es posible que tenga problemas con el diálogo "Abrir archivo" en su programa, dependiendo de cómo esté configurado. Pero si tiene una sola carpeta donde están todos sus archivos, debería poder usarla.

Una forma más complicada, pero potencialmente mejor, sería crear un programa proxy. Mantenga todas las extensiones de archivo, pero haga que el programa proxy las abra. Haga que su programa examine el binario y elija qué tipo de archivo es y qué programa iniciar. Esto requerirá que pase algún tiempo escribiendo su programa, que puede o no valer la pena para usted.

Joel
fuente
Sí, pero utilizando una extensión totalmente diferente significa que a menudo no puede abrir los archivos desde dentro de los programas.
endolito el
Sí, lo señalé. Sin embargo, el segundo método que sugerí no tendrá ese problema.
Joel
2

Microsoft Visual Studio implementa su última idea. Cuando inicia un archivo .sln, un pequeño trozo comprueba el número de versión de la solución y lanza la versión correcta de Visual Studio (si tiene varias versiones instaladas).

Por supuesto, la coordinación aquí es un poco más fácil ya que (A) el formato de archivo está diseñado para esto y (B) todas son versiones del mismo software, del mismo fabricante.

MSalters
fuente
1

Una solución rápida es agregar entradas de contexto adicionales al menú contextual del explorador. O para usar la entrada de contexto 'abrir con'. El primero es más cómodo, ya que se pueden agregar parámetros de llamada y especificar nombres 'reveladores'. También permite abrir un archivo con diferentes versiones del mismo programa (si está instalado en paralelo).

Por supuesto, este enfoque no es automático. Uno tiene que saber la aplicación adecuada. Pero para los tipos de archivos donde la detección basada en la base de datos fallará (por ejemplo, archivos de texto u otros archivos sin un "número mágico"), siempre tiene la opción.

Por cierto: el sistema operativo menos conocido 'GEOS' (que era un competidor Win3 en su momento y mucho más adelante) tenía un encabezado fijo de 256 bytes para todos los archivos donde se almacenaba la aplicación de creación, el icono y los avisos de derechos de autor (junto con un campo libre para notas propias). Como esto era parte del archivo y no el sistema de archivos o un diccionario del sistema operativo, era transparente cuando los archivos se movían a través de sistemas de archivos o incluso a un sistema operativo diferente (había una extensión de explorador para W95).

Peter Painter
fuente