Lassen Sie Windows Dateien mit derselben Erweiterung unterschiedlich behandeln

10

Mehrere Programme verwenden dieselbe Dateierweiterung, aber die Formate sind völlig unterschiedlich und inkompatibel. Zum Beispiel habe ich .schDateien auf meinem Computer, die in mindestens 5 verschiedenen Formaten vorliegen (TINA, PSpice, PADS, Protel und Eagle). Gibt es eine Möglichkeit, Windows dazu zu bringen, sie anders zu behandeln, sodass ein Doppelklick auf eine solche Datei sie in dem Programm öffnet, in dem sie geöffnet werden soll?

Linux verwendet magische Zahlen in den Dateien selbst, um zu unterscheiden, und verwendet nur Dateierweiterungen als Fallback-Plan. (Alle PNG-Dateien beginnen beispielsweise mit den Bytes 89 50 4E 47 0D 0A 1A 0A , unabhängig davon, wie Sie sie nennen.) Es wäre schön, wenn Windows dies unterstützen könnte, aber wahrscheinlich sehr schwer zu implementieren. Vielleicht etwas Einfacheres wie eine Erweiterung der zweiten Ebene, wie filename.program1.schund filename.program2.sch? Vielleicht eine Art Filter, der Dateien im laufenden Betrieb umbenennt?

Bessere Idee: Verknüpfen der mehrdeutigen Erweiterung mit einem Vorprozessor (.bat-Datei oder dedizierte App), der nach einer Erweiterung der zweiten Ebene sucht oder in die Datei selbst geht und nach der magischen Zahl sucht und dann das entsprechende Programm startet?

Endolith
quelle
1
TrID könnte für Sie von Interesse sein - es verfügt über eine Datenbank mit 4400 binären Signaturen.
Josh3736
Ich erinnere mich, dass dies früher unter dem RISC-Betriebssystem geschah, aber manchmal zu Frustration führte, wenn Sie mehrere Apps hatten, die denselben Dateityp verarbeiten konnten und das Programm mit dem falschen Programm öffneten!
Matt Wilko
@ Matt: Großartig, danke! file-extension.net/seeker/file_extension_sch
Endolith

Antworten:

9

Windows startet keine Dateien basierend auf Informationen in der Datei. Das Erstellen einer Datenbank dafür würde unglaublich viel Arbeit und Programmierung erfordern . Die einzig wahre Möglichkeit, eine Datei zu identifizieren, besteht in den binären Signaturen in der Datei, sofern diese überhaupt vorhanden sind. Dies muss vom Software-Autor implementiert werden.

In Windows werden Dateien an das Programm übergeben, das Sie für eine bestimmte Dateierweiterung angegeben haben. Windows bestimmt die Dateierweiterung als Teilzeichenfolge, die auf das letzte Auftreten eines Punkts folgt. Daher ist dies mit den von Ihnen veröffentlichten Dateinamen nicht möglich.

Sie müssen die Dateien entweder umbenennen (und ihnen eindeutige Dateierweiterungen geben) oder eine Batchdatei schreiben, um die entsprechende Anwendung für Sie zu starten. Weitere Informationen finden Sie in diesem Technet-Artikel .

Durchbruch
quelle
1
Ich habe versucht, diese Funktion zu erstellen, indem ich eine eindeutige Dateierweiterung erstellt habe, aber selbst wenn dies der Fall wäre, besteht das eigentliche Problem darin, dass die meisten Programme trotz Inhalt nur ihre eigenen Erweiterungen erkennen und sie trotzdem nicht öffnen würden.
KCotreau
2
Ich würde jedoch gerne jemanden sehen, der dies tut. Ich denke, Sie würden es umgehen, wenn ein einzelnes Programm Dateien aller Erweiterungen öffnet und dieses Programm seine eigene Datenbank führt (mithilfe der alternativen Streams von NTFS, um die Dateien zu verfolgen) und das jeweilige Programm startet, für das der Benutzer definiert jede Datei. Es wäre nicht , dass viel Arbeit, aber ich kann eine Menge Probleme mit diesem Ansatz sehen, so dass wahrscheinlich ist , warum niemand es getan hat.
Sasha Chedygov
2
es wäre nicht ZU schwer - es gibt Tools, die dies tun (trid oder file), und die meisten posix-basierten oses betrachten Dateikopfzeilen und keine Erweiterungen. Es ist weniger eine Frage der Designauswahl als des Aufwands. Natürlich wäre dies für einen Dritten viel schwieriger, aber wenn MS dies für erforderlich hielt, könnte dies halbtrivial sein
Journeyman Geek
3
"Verwenden der alternativen Streams von NTFS, um den Überblick über Dateien zu behalten." Mir ist klar, warum Windows das Linux / POSIX-Modell nicht implementiert. Einfach, dass es eine gelesene Datei erfordert. Wenn dies der Fall war, muss jedes Mal, wenn Sie mit der rechten Maustaste auf eine Datei klicken, eine teure gelesene Datei ausgelöst werden. Schlimmer noch, stellen Sie sich vor, es wäre eine Netzwerkdatei und die Verbindung hätte eine merkliche Verzögerung. Die Leute würden WinDoze einfach die Schuld geben. Raymond Chen würde auf diese Technik zurückgreifen und auch dazu führen, dass eine Datei zurückgerufen wird, wenn sie sich in einem tertiären Speicherbereich befindet.
Surfasb
1
Mit Windows können Sie dieses Modell jedoch brechen. . .
Surfasb
8

Ich habe es selbst gelöst:

Ich habe ein Python-Skript erstellt, das die ersten Bytes einer Datei liest, sie mit einem Wörterbuch vergleicht und dann das entsprechende Programm basierend auf den magischen Zahlen startet.

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

Die neueste Version wird hier sein: Starten Sie mehrdeutige Dateien im entsprechenden Programm

Ich habe versucht, die Dateierweiterung mit diesem Skript zu verknüpfen, aber Windows 7 hat es mir nicht erlaubt. Es wurde stattdessen nur mit Python verknüpft, also ging ich in die Registrierung und fügte den Skriptnamen manuell hinzu.

So ordnen Sie eine Dateierweiterung einem Python-Skript zu

Raum für Verbesserungen, aber es funktioniert. Ich kann auf verschiedene Dateien mit derselben .sch-Erweiterung doppelklicken und sie werden in verschiedenen Apps geöffnet.

Update: Ich habe es mit cx_freeze mit einer externen YAML-Konfigurationsdatei in eine EXE-Datei konvertiert und es ist einfach zuzuordnen. Siehe auch diesen libmagischen Vorschlag . Ich bin mir nicht sicher, ob ich daraus einen vollwertigen "libmagic Launcher für Windows" machen soll oder ob es besser ist, nur eine Dateierweiterung mit einer EXE-Datei und einer einfachen YAML-Datei zu verarbeiten.

Endolith
quelle
2
Es wäre eigentlich trivial, als Exe zu schreiben. . .
Surfasb
Nicht, wenn Sie nicht wissen, wie man Exes schreibt :)
Endolith
1
Es war kein Schlag für dich. Es war etwas für mich :)
Surfasb
@surasb: Also hast du mir schon eine .exe geschrieben? Es ist trivial, oder? :)
Endolith
Ich hab es total vergessen! Ich habe in der letzten Woche mit 3D-Netzen auf Silverlight herumgespielt. Später heute Abend, nachdem ich dieses RAID-Array babysittet habe. . .
Surfasb
3

Zu Beginn können Sie einen der Dateitypen umbenennen, um eine neue Erweiterung zu erhalten, und im Dialogfeld "Öffnen mit" ein Standardprogramm zum Öffnen dieser Dateitypen festlegen.

Dies betrifft jedoch nicht das Umbenennungsproblem. Sie vereinfachen die Dinge jedoch, indem Sie einen bestimmten Ordner erstellen, in dem Sie alle Dateien aus einem der Programme ablegen. Anschließend können Sie ein Skript schreiben, um Dateien in diesem Ordner automatisch in Ihre neue Dateierweiterung umzubenennen.

Je nach Einrichtung haben Sie möglicherweise Probleme mit dem Dialogfeld "Datei öffnen" in Ihrem Programm. Wenn Sie jedoch einen einzigen Ordner haben, in dem sich alle Ihre Dateien befinden, sollten Sie diesen einfach verwenden können.

Ein komplizierterer, aber möglicherweise besserer Weg wäre die Erstellung eines Proxy-Programms. Behalten Sie alle Dateierweiterungen bei, lassen Sie sie jedoch vom Proxy-Programm öffnen. Lassen Sie Ihr Programm die Binärdatei untersuchen und auswählen, um welchen Dateityp es sich handelt und welches Programm gestartet werden soll. Dies erfordert, dass Sie einige Zeit damit verbringen, Ihr Programm zu schreiben, was sich für Sie möglicherweise lohnt oder nicht.

Joel
quelle
Ja, aber eine ganz andere Erweiterung bedeutet , dass Sie oft nicht die Dateien aus öffnen können innerhalb der Programme.
Endolith
Ja, darauf habe ich hingewiesen. Die zweite von mir vorgeschlagene Methode hat dieses Problem jedoch nicht.
Joel
2

Microsoft Visual Studio implementiert Ihre letzte Idee. Wenn Sie eine SLN-Datei starten, überprüft ein kleiner Stub die Versionsnummer der Lösung und startet die richtige Version von Visual Studio (wenn Sie mehrere Versionen installiert haben).

Natürlich ist die Koordination hier etwas einfacher, da (A) das Dateiformat dafür ausgelegt ist und (B) alle Versionen derselben Software desselben Herstellers sind.

MSalters
quelle
1

Eine schnelle Lösung besteht darin, dem Explorer-Kontextmenü zusätzliche Kontexteinträge hinzuzufügen. Oder um den Kontexteintrag "Öffnen mit" zu verwenden. Die erste ist bequemer, da man Aufrufparameter hinzufügen und 'aussagekräftige' Namen angeben kann. Es ermöglicht auch das Öffnen einer Datei mit verschiedenen Versionen desselben Programms (falls parallel installiert).

Natürlich ist dieser Ansatz nicht automatisch. Man muss die richtige Anwendung kennen. Bei Dateitypen, bei denen die datenbankbasierte Erkennung fehlschlagen würde (z. B. Textdateien oder andere Dateien ohne "magische Zahl"), haben Sie immer die Wahl.

Übrigens: Das weniger bekannte Betriebssystem 'GEOS' (das zu seiner Zeit ein Win3-Konkurrent war und weit voraus) hatte einen festen 256-Byte-Header für alle Dateien, in denen die erstellende Anwendung, das Symbol und die Copyright-Hinweise gespeichert waren (zusammen mit einem freien Feld für eigene Notizen). Da dies Teil der Datei und nicht des Dateisystems oder eines Betriebssystemwörterbuchs war, war es transparent, wenn Dateien über Dateisysteme oder sogar auf ein anderes Betriebssystem verschoben wurden (es gab eine Explorer-Erweiterung für W95).

Peter Maler
quelle