Chiedi a Windows di trattare i file con la stessa estensione in modo diverso


10

Più programmi utilizzano la stessa estensione di file, ma i formati sono totalmente diversi e incompatibili. Ad esempio, ho .schfile sul mio computer che sono in almeno 5 formati diversi (TINA, PSpice, PADS, Protel e Eagle). C'è un modo per convincere Windows a trattarli in modo diverso, in modo che il doppio clic su un tale file lo apra nel programma in cui è destinato ad essere aperto?

Linux utilizza numeri magici nei file stessi per differenziare e utilizza solo estensioni di file come piano di fallback. (Tutti i file PNG iniziano con i byte 89 50 4E 47 0D 0A 1A 0A , ad esempio, indipendentemente da come li chiami.) Sarebbe bello se Windows potesse supportarlo, ma probabilmente molto difficile da implementare. Forse qualcosa di più semplice come un'estensione di secondo livello, come filename.program1.sche filename.program2.sch? Forse una sorta di filtro che rinomina i file al volo?

Migliore idea: associare l'estensione ambigua a un pre-processore (file .bat o app dedicata) che verifica un'estensione di secondo livello o va nel file stesso e cerca il numero magico e quindi avvia il programma appropriato?


1
TrID può interessarti: ha un database di 4400 firme binarie.
josh3736,

Ricordo che questo accadeva sul sistema operativo RISC ma a volte causava frustrazione quando si disponevano di più app in grado di elaborare lo stesso tipo di file e si apriva il programma con il programma sbagliato!
Matt Wilko,

Risposte:


9

Windows non avvia i file in base a qualsiasi informazione contenuta nel file: la creazione di un database per questo richiederebbe una quantità incredibile di lavoro e programmazione. L'unico vero modo per identificare un file è tramite le firme binarie nel file, se il file lo ha anche, e questo dipende dall'autore del software da implementare.

In Windows, i file vengono passati al programma specificato per una determinata estensione. Windows determina l'estensione di un file come sottostringa che segue l'ultima occorrenza di un punto, quindi non è possibile con i nomi dei file che hai pubblicato.

Devi rinominare i file (e assegnare loro estensioni di file univoche) o scrivere un file batch per avviare l'applicazione appropriata per te. Per maggiori dettagli, vedi questo articolo Technet .


1
Stavo cercando di farlo funzionare creando un'estensione di file univoca, ma anche se lo avesse fatto, il vero problema è che la maggior parte dei programmi riconoscerà solo le proprie estensioni nonostante il contenuto e non le aprirà comunque.
KCotreau,

2
Mi piacerebbe vedere qualcuno fare questo, però. Penso che il modo in cui lo aggireresti è avere un singolo programma che apra i file di tutte le estensioni e che quel programma mantenga il proprio database (usando i flussi alternativi di NTFS per tenere traccia dei file) e avvii ogni rispettivo programma per il quale l'utente definisce ogni file. Non sarebbe che molto lavoro, ma posso vedere un sacco di problemi con questo approccio, in modo che è probabilmente il motivo per cui nessuno ha fatto.
Sasha Chedygov,

2
non sarebbe TROPPO duro - ci sono strumenti che lo fanno (trid o file) e la maggior parte dei casi basati su posix guardano le intestazioni dei file e non le estensioni. È meno una questione di scelte progettuali, rispetto alla quantità di sforzo che ci vorrebbe. Naturalmente questo sarebbe molto più difficile per una terza parte, ma se la SM lo ritenesse necessario, questo potrebbe essere semi-banale
Journeyman Geek

3
"Utilizzo dei flussi alternativi di NTFS per tenere traccia dei file." È ovvio per me perché Windows non implementa il modello Linux / POSIX. Semplicemente richiede un file letto. In tal caso, ogni volta che si fa clic con il pulsante destro del mouse su un file, è necessario attivare una lettura di file costosa. Ancora peggio, immagina se fosse un file di rete e la connessione avesse un notevole ritardo. La gente darebbe solo la colpa a WinDoze. Raymond Chen si baserebbe su questa tecnica anche perché provocherebbe il richiamo di un file se si trovava in un'area di archiviazione terziaria.
surfasb,

1
Ma Windows ti consente di rompere quel modello. . .
surfasb,

8

L'ho risolto io stesso:

Ho creato uno script Python che legge i primi byte di un file e li confronta con un dizionario, quindi avvia il programma appropriato in base ai numeri magici.

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])

L'ultima versione sarà qui: avvia file ambigui nel programma appropriato

Ho provato ad associare l'estensione del file a questo script, ma Windows 7 non me l'ha permesso. Invece lo ha associato a Python, quindi sono entrato nel registro e ho aggiunto manualmente il nome dello script.

Come associare un'estensione di file a uno script Python

Spazio per miglioramenti, ma funziona. Posso fare doppio clic su file diversi con la stessa estensione .sch e si aprono in diverse app.

Aggiornamento: l' ho convertito in un file .exe utilizzando cx_freeze, con un file di configurazione YAML esterno ed è facile da associare. Vedi anche questa proposta libmagica . Non sono sicuro se dovrei trasformarlo in un "launcher libmagic completo per Windows" o se è meglio gestire solo un'estensione di file con un file .exe e un semplice file YAML.


2
In realtà sarebbe banale scrivere come exe. . .
surfasb,

Non se non sai come scrivere exes :)
endolith

1
Non è stato un colpo per te. Era qualcosa per me :)
surfasb

@surasb: Quindi mi hai già scritto un file .exe? È banale, vero? :)
endolith

Mi ero completamente dimenticato! Ho pasticciato con mesh 3D su Silverlight la scorsa settimana. Più tardi stasera, dopo aver fatto da babysitter a questo array RAID. . .
surfasb,

3

Per iniziare, puoi rinominare uno dei tipi di file per avere una nuova estensione e utilizzare la finestra di dialogo "Apri con" per impostare un programma predefinito per aprire quei tipi di file.

Tuttavia, questo non risolve il problema della ridenominazione. Ma semplifichi le cose creando una cartella specifica in cui metti tutti i file da uno dei programmi. Quindi puoi scrivere uno script per rinominare automaticamente i file in quella cartella nella tua nuova estensione.

Potresti avere problemi con una finestra di dialogo "Apri file" nel tuo programma, a seconda di come è impostata. Ma se hai una singola cartella in cui si trovano tutti i tuoi file, dovresti essere in grado di usarlo.

Un modo più complicato, ma potenzialmente migliore sarebbe quello di creare un programma proxy. Conservare tutte le estensioni dei file, ma farle aprire dal programma proxy. Chiedi al tuo programma di esaminare il file binario e scegliere quale tipo di file è e quale programma avviare. Ciò richiederà di dedicare un po 'di tempo a scrivere il tuo programma, che potrebbe valere o meno la pena.


Sì, ma l'utilizzo di un'estensione completamente diversa significa che spesso non è possibile aprire i file all'interno dei programmi.
endolith

si, l'ho sottolineato. Il secondo metodo che ho suggerito non avrà questo problema però.
Gioele

2

Microsoft Visual Studio implementa la tua ultima idea. Quando si avvia un file .sln, un piccolo stub controlla il numero di versione della soluzione e avvia la versione corretta di Visual Studio (se sono installate più versioni).

Naturalmente, il coordinamento qui è un po 'più semplice poiché (A) il formato del file è progettato per questo e (B) sono tutte versioni dello stesso software, dello stesso produttore.


1

Una soluzione rapida è aggiungere ulteriori voci di contesto al menu di scelta rapida di Explorer. O per utilizzare la voce di contesto "Apri con". Il primo è più comodo in quanto si possono aggiungere parametri di chiamata e specificare nomi "che dicono". Inoltre, consente di aprire un file con versioni diverse dello stesso programma (se installato in parallelo).

Naturalmente questo approccio non è automatico. Uno deve conoscere l'applicazione corretta. Ma per i tipi di file in cui il rilevamento basato sul database fallirebbe (ad es. File di testo o altri file senza un "numero magico"), hai sempre la scelta.

A proposito: il meno noto sistema operativo 'GEOS' (che era un concorrente Win3 a suo tempo e molto più avanti) aveva un'intestazione fissa di 256 byte per tutti i file in cui erano memorizzati l'applicazione di creazione, icona e avvisi di copyright (insieme a un campo libero per proprie note). Poiché faceva parte del file e non del file system o di un dizionario del sistema operativo, era trasparente quando i file venivano spostati su file system o persino su un sistema operativo diverso (esisteva un'estensione di esplorazione per W95).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.