Obtenha o Windows para tratar os arquivos com a mesma extensão de maneira diferente

10

Vários programas usam a mesma extensão de arquivo, mas os formatos são totalmente diferentes e incompatíveis. Por exemplo, eu tenho .sch arquivos no meu computador que estão em pelo menos 5 formatos diferentes (TINA, PSpice, PADS, Protel e Eagle). Existe uma maneira de fazer com que o Windows os trate de maneira diferente, de modo que clicar duas vezes em um desses arquivos abre o programa no qual ele deve ser aberto?

Usa Linux números mágicos nos próprios arquivos para diferenciar e usar apenas as extensões de arquivos como um plano de fallback. (Todos Arquivos PNG comece com os bytes 89 50 4E 47 0D 0A 1A 0A, por exemplo, independentemente do que você nomeá-los.) Seria bom se o Windows pudesse suportar isso, mas provavelmente muito difícil de implementar. Talvez algo mais simples como uma extensão de segundo nível, como filename.program1.sch e filename.program2.sch? Talvez algum tipo de filtro que renomeie arquivos na hora?

Melhor idéia: associar a extensão ambígua a um pré-processador (arquivo .bat ou aplicativo dedicado) que verifica uma extensão de segundo nível ou que entra no próprio arquivo, verifica o número mágico e inicia o programa apropriado?

endolith
fonte
1
Trid pode ser de interesse para você - ele tem um banco de dados de 4400 assinaturas binárias.
josh3736
Eu lembro que isso costumava acontecer no SO RISC mas às vezes usado para causar frustração quando você tinha vários aplicativos que poderiam processar o mesmo tipo de arquivo e ele iria abrir o programa com o programa errado!
Matt Wilko
@Matt: Ótimo, obrigado! file-extension.net/seeker/file_extension_sch
endolith

Respostas:

9

Windows faz não Lançar arquivos baseados em qualquer informação no arquivo - construir um banco de dados para isso levaria uma incrível quantidade de trabalho e programação. A única maneira verdadeira de identificar um arquivo é pelas assinaturas binárias no arquivo, se o arquivo o tiver, e isso depende do autor do software implementar.

No Windows, os arquivos são passados ​​para o programa que você especifica para uma extensão de arquivo específica. O Windows determina a extensão de um arquivo como a subsequência que segue a última ocorrência de um período, portanto, não é possível com os nomes de arquivos que você publicou.

É necessário renomear os arquivos (e fornecer extensões de arquivo exclusivas) ou gravar um arquivo em lotes para iniciar o aplicativo apropriado para você. Para mais detalhes, veja este artigo da Technet .

Breakthrough
fonte
1
Eu estava tentando fazer isso funcionar criando uma extensão de arquivo única, mas mesmo que ele fizesse isso, o verdadeiro problema é que a maioria dos programas reconheceria suas próprias extensões apesar do conteúdo, e não os abriria de qualquer maneira.
KCotreau
2
Eu adoraria ver alguém fazer isso, no entanto. Eu acho que a maneira como você daria a volta é ter um único programa de arquivos abertos de todas as extensões, e ter esse programa manter seu próprio banco de dados (usando fluxos alternativos do NTFS para controlar arquivos) e lançar cada programa respectivo que o usuário define para cada arquivo. Não seria naquela muito trabalho, mas eu posso ver muitos problemas com essa abordagem, então é provavelmente por isso que ninguém fez isso.
Sasha Chedygov
2
não seria muito difícil - existem ferramentas que fazem isso (trid, ou arquivo) e a maioria dos arquivos baseados em posix observa cabeçalhos de arquivos, e não extensões. É menos uma questão de escolhas de design do que a quantidade de esforço necessário. Naturalmente, isso seria muito mais difícil para uma terceira parte, mas se a MS sentir que isso era necessário, isso pode ser um problema semi-trivial.
Journeyman Geek
3
"Usando fluxos alternativos do NTFS para manter o controle dos arquivos." É óbvio para mim porque o Windows não implementa o modelo Linux / POSIX. Simplesmente requer uma leitura de arquivo. Se fosse esse o caso, toda vez que você clicasse com o botão direito em um arquivo, ele teria que disparar um arquivo caro lido. Pior ainda, imagine se fosse um arquivo de rede e a conexão tivesse um atraso perceptível. As pessoas culpam apenas o WinDoze. Raymond Chen iria bash sobre esta técnica também porque causaria um arquivo a ser recuperado se fosse em uma área de armazenamento terciário.
surfasb
1
Mas o Windows permite que você quebre esse modelo. . .
surfasb
8

Eu resolvi eu mesmo:

Fiz um script em Python que lê os primeiros bytes de um arquivo e compara-os a um dicionário, depois lança o programa apropriado com base nos 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(len(max(magic_numbers.keys())))

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

A última versão estará aqui: Lançar arquivos ambíguos no programa apropriado

Eu tentei associar a extensão do arquivo com este script, mas o Windows 7 não me deixou. Apenas associou-o ao Python, então entrei no registro e adicionei o nome do script manualmente.

How to associate a file extension with a Python script

Espaço para melhorias, mas funciona. Eu posso clicar duas vezes em arquivos diferentes com a mesma extensão .sch e eles são abertos em aplicativos diferentes.

Atualizar: Eu converti para um .exe usando cx_freeze, com um arquivo de configuração YAML externo, e é fácil associar. Veja também esta proposta libmagic . Não tenho certeza se eu deveria fazer isso em um "lançador de libmagic para o Windows" de pleno direito ou se é melhor lidar com apenas uma extensão de arquivo com um. Exe e um simples arquivo YAML.

endolith
fonte
2
Isso seria realmente trivial para escrever como um exe. . .
surfasb
Não se você não sabe escrever exes :)
endolith
1
Não foi uma batida em você. Foi algo para mim :)
surfasb
@surasb: Então você já me escreveu um .exe? É trivial, certo? :)
endolith
Eu esqueci totalmente! Eu estive mexendo com malhas 3D no Silverlight durante a semana passada. Mais tarde hoje à noite, depois que eu tomar conta dessa matriz RAID. . .
surfasb
3

Para começar, você pode renomear um dos tipos de arquivos para ter uma nova extensão e usar a caixa de diálogo "abrir com" para definir um programa padrão para abrir esses tipos de arquivos.

Isso não resolve o problema de renomeação. Mas você simplifica as coisas fazendo uma pasta específica onde você coloca todos os arquivos de um dos programas. Em seguida, você pode escrever um script para renomear automaticamente os arquivos nessa pasta para a nova extensão de arquivo.

Você pode ter problemas com um diálogo "Abrir Arquivo" em seu programa, dependendo de como ele está configurado. Mas se você tem uma única pasta onde todos os seus arquivos são, você deve ser capaz de usar isso.

Uma maneira mais complicada, mas potencialmente melhor, seria criar um programa de proxy. Mantenha todas as extensões de arquivo, mas faça com que elas sejam abertas pelo programa de proxy. Peça ao seu programa para examinar o binário e escolher o tipo de arquivo e qual programa iniciar. Isso exigirá que você passe algum tempo escrevendo seu programa, o que pode ou não valer a pena para você.

Joel
fonte
Sim, mas usar uma extensão totalmente diferente significa que muitas vezes você não consegue abrir os arquivos dentro os programas.
endolith
sim eu apontei isso. O segundo método que sugeri não terá esse problema.
Joel
2

O Microsoft Visual Studio implementa sua última ideia. Quando você inicia um arquivo .sln, um pequeno stub verifica o número da versão da solução e lança a versão correta do Visual Studio (se você tiver várias versões instaladas).

Obviamente, a coordenação aqui é um pouco mais fácil, já que (A) o formato do arquivo é projetado para isso e (B) são todas versões do mesmo software, do mesmo fabricante.

MSalters
fonte
1

Uma solução rápida é adicionar entradas de contexto adicionais ao menu de contexto do explorador. Ou para usar a entrada de contexto 'abrir com'. O primeiro é mais confortável, pois é possível adicionar parâmetros de chamada e especificar nomes "informativos". Também permite abrir um arquivo com diferentes versões do mesmo programa (se instalado em paralelo).

Claro que esta abordagem não é automática. É preciso conhecer a aplicação correta. Mas para tipos de arquivo em que a detecção baseada em banco de dados falharia (por exemplo, arquivos de texto ou outros arquivos sem um "número mágico"), você sempre tem a escolha.

BTW: O SO menos conhecido 'GEOS' (que era um concorrente do Win3 em seu tempo e muito à frente) tinha um cabeçalho fixo de 256 bytes para todos os arquivos onde o aplicativo de criação, ícone de avisos de copyright foram armazenados (juntamente com um campo livre para notas próprias). Como isso fazia parte do arquivo e não do sistema de arquivos ou de um dicionário do sistema operacional, era transparente quando os arquivos eram movidos entre os sistemas de arquivos ou até mesmo para um sistema operacional diferente (havia uma extensão do explorador para o W95).

Peter Painter
fonte