Obtenez Windows pour traiter les fichiers avec la même extension différemment


10

Plusieurs programmes utilisent la même extension de fichier, mais les formats sont totalement différents et incompatibles. Par exemple, j'ai des .schfichiers sur mon ordinateur qui sont dans au moins 5 formats différents (TINA, PSpice, PADS, Protel et Eagle). Existe-t-il un moyen pour que Windows les traite différemment, de sorte qu'un double-clic sur un tel fichier l'ouvre dans le programme dans lequel il doit être ouvert?

Linux utilise des nombres magiques dans les fichiers eux-mêmes pour se différencier, et utilise uniquement les extensions de fichier comme plan de secours. (Tous les fichiers PNG commencent par les octets 89 50 4E 47 0D 0A 1A 0A , par exemple, quel que soit le nom que vous leur donnez.) Ce serait bien si Windows pouvait prendre en charge cela, mais probablement très difficile à implémenter. Peut-être quelque chose de plus simple comme une extension de deuxième niveau, comme filename.program1.schet filename.program2.sch? Peut-être une sorte de filtre qui renomme les fichiers à la volée?

Meilleure idée: associer l'extension ambiguë à un préprocesseur (fichier .bat ou application dédiée) qui recherche une extension de deuxième niveau ou va dans le fichier lui-même et recherche le nombre magique, puis lance le programme approprié?


1
Le TrID peut vous intéresser - il possède une base de données de 4400 signatures binaires.
josh3736

Je me souviens que cela se produisait sur le système d'exploitation RISC mais parfois provoquait de la frustration lorsque vous aviez plusieurs applications qui pouvaient traiter le même type de fichier et que le programme était ouvert avec le mauvais programme!
Matt Wilko

Réponses:


9

Windows ne lance pas de fichiers basés sur des informations contenues dans le fichier - la création d'une base de données pour cela prendrait une quantité incroyable de travail et de programmation. La seule véritable façon d'identifier un fichier est par les signatures binaires dans le fichier, si le fichier le possède même, et c'est à l'auteur du logiciel de le mettre en œuvre.

Sous Windows, les fichiers sont transmis au programme que vous spécifiez pour une extension de fichier particulière. Windows détermine l'extension d'un fichier comme la sous-chaîne qui suit la dernière occurrence d'un point, il n'est donc pas possible avec les noms de fichiers que vous avez publiés.

Vous devez soit renommer les fichiers (et leur donner des extensions de fichier uniques), soit écrire un fichier batch pour lancer l'application appropriée pour vous. Pour plus de détails, consultez cet article Technet .


1
J'essayais de faire fonctionner cela en créant une extension de fichier unique, mais même s'il le faisait, le vrai problème est que la plupart des programmes ne reconnaîtront que leurs propres extensions malgré le contenu, et ne les ouvriraient pas de toute façon.
KCotreau

2
J'adorerais voir quelqu'un faire ça, cependant. Je pense que la façon dont vous vous en sortiriez serait d'avoir un seul programme ouvert des fichiers de toutes les extensions, et d'avoir ce programme garder sa propre base de données (en utilisant les flux alternatifs de NTFS pour garder une trace des fichiers) et lancer chaque programme respectif que l'utilisateur définit pour chaque fichier. Il ne serait pas que beaucoup de travail, mais je peux voir beaucoup de problèmes avec cette approche, de sorte que est sans doute pourquoi personne ne l' a fait.
Sasha Chedygov

2
ce ne serait pas TROP difficile - il y a des outils qui le font (trid, ou fichier) et la plupart des oses basés sur posix regardent les en-têtes de fichiers, et non les extensions. C'est moins une question de choix de conception que d'effort. Naturellement, cela serait beaucoup plus difficile pour un tiers, mais si MS estimait que cela était nécessaire, cela pourrait être semi-trivial
Journeyman Geek

3
"Utilisation des flux alternatifs de NTFS pour garder une trace des fichiers." Il est évident pour moi pourquoi Windows n'implémente pas le modèle Linux / POSIX. Simplement qu'il nécessite une lecture de fichier. Si tel était le cas, chaque fois que vous faites un clic droit sur un fichier, il doit déclencher une lecture coûteuse du fichier. Pire encore, imaginez s'il s'agissait d'un fichier réseau et que la connexion avait un retard notable. Les gens blâmeraient simplement WinDoze. Raymond Chen se baserait sur cette technique, car elle entraînerait le rappel d'un fichier s'il se trouvait dans une zone de stockage tertiaire.
surfasb

1
Mais Windows vous permet de casser ce modèle. . .
surfasb

8

Je l'ai résolu moi-même:

J'ai créé un script Python qui lit les premiers octets d'un fichier et les compare à un dictionnaire, puis lance le programme approprié en fonction des nombres magiques.

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 dernière version sera ici: Lancez des fichiers ambigus dans le programme approprié

J'ai essayé d'associer l'extension de fichier à ce script, mais Windows 7 ne me l'a pas permis. Il l'a simplement associé à Python à la place, alors je suis allé dans le registre et j'ai ajouté le nom du script manuellement.

Comment associer une extension de fichier à un script Python

Peut être amélioré, mais cela fonctionne. Je peux double-cliquer sur différents fichiers avec la même extension .sch et ils s'ouvrent dans différentes applications.

Mise à jour: je l'ai converti en .exe en utilisant cx_freeze, avec un fichier de configuration YAML externe, et il est facile à associer. Voir aussi cette proposition libmagique . Je ne sais pas si je devrais en faire un "lanceur libmagic à part entière pour Windows" ou s'il est préférable de gérer une seule extension de fichier avec un .exe et un simple fichier YAML.


2
Ce serait en fait trivial d'écrire comme un exe. . .
surfasb

Pas si vous ne savez pas comment écrire des ex :)
endolith

1
Ce n'était pas un coup sur toi. C'était quelque chose pour moi :)
surfasb

@surasb: Vous m'avez donc déjà écrit un .exe? C'est trivial, non? :)
endolith

J'ai complètement oublié! J'ai joué avec des maillages 3D sur Silverlight la semaine dernière. Plus tard ce soir, après avoir gardé cette matrice RAID. . .
surfasb

3

Pour commencer, vous pouvez renommer l'un des types de fichiers pour avoir une nouvelle extension et utiliser la boîte de dialogue "Ouvrir avec" pour définir un programme par défaut pour ouvrir ces types de fichiers.

Cela ne résout cependant pas le problème de changement de nom. Mais vous simplifiez les choses en créant un dossier spécifique où vous placez tous les fichiers de l'un des programmes. Ensuite, vous pouvez écrire un script pour renommer automatiquement les fichiers de ce dossier en votre nouvelle extension de fichier.

Vous pouvez avoir des problèmes avec une boîte de dialogue "Ouvrir un fichier" dans votre programme, selon la façon dont il est configuré. Mais si vous avez un seul dossier où se trouvent tous vos fichiers, vous devriez pouvoir simplement l'utiliser.

Une façon plus compliquée, mais potentiellement meilleure, serait de créer un programme proxy. Conservez toutes les extensions de fichier, mais faites-les ouvrir par le programme proxy. Demandez à votre programme d'examiner le binaire et de choisir de quel type de fichier il s'agit et de quel programme démarrer. Cela vous obligera à consacrer un certain temps à la rédaction de votre programme, qui peut ou non valoir la peine pour vous.


Oui, mais en utilisant une extension totalement différente signifie que vous ne pouvez pas souvent ouvrir les fichiers au sein des programmes.
endolith

oui je l'ai souligné. La deuxième méthode que j'ai suggérée n'aura pas ce problème.
Joel

2

Microsoft Visual Studio implémente votre dernière idée. Lorsque vous lancez un fichier .sln, un petit talon vérifie le numéro de version de la solution et lance la version correcte de Visual Studio (si plusieurs versions sont installées).

Bien sûr, la coordination ici est un peu plus facile car (A) le format de fichier est conçu pour cela et (B) ce sont toutes des versions du même logiciel, du même fabricant.


1

Une solution rapide consiste à ajouter des entrées de contexte supplémentaires au menu contextuel de l'explorateur. Ou pour utiliser l'entrée de contexte «Ouvrir avec». Le premier est plus confortable car on peut ajouter des paramètres d'appel et spécifier des noms «révélateurs». Il permet également d'ouvrir un fichier avec différentes versions du même programme (s'il est installé en parallèle).

Bien sûr, cette approche n'est pas automatique. Il faut connaître la bonne application. Mais pour les types de fichiers où la détection basée sur la base de données échouerait (par exemple les fichiers texte ou autres fichiers sans "nombre magique"), vous avez toujours le choix.

BTW: le système d'exploitation moins connu `` GEOS '' (qui était un concurrent de Win3 à son époque et loin devant) avait un en-tête de 256 octets fixe pour tous les fichiers où l'application de création, l'icône et les avis de droit d'auteur étaient stockés (avec un champ libre pour propres notes). Comme cela faisait partie du fichier et non du système de fichiers ou d'un dictionnaire de système d'exploitation, il était transparent lorsque les fichiers étaient déplacés sur des systèmes de fichiers ou même vers un autre système d'exploitation (il y avait une extension d'exploration pour W95).

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.