Spraw, aby system Windows różnie traktował pliki z tym samym rozszerzeniem


10

Wiele programów używa tego samego rozszerzenia pliku, ale formaty są zupełnie inne i niekompatybilne. Na przykład mam .schpliki na komputerze, które są w co najmniej 5 różnych formatach (TINA, PSpice, PADS, Protel i Eagle). Czy istnieje sposób, aby system Windows traktował je inaczej, tak aby dwukrotne kliknięcie takiego pliku otworzyło go w programie, w którym ma zostać otwarty?

Linux używa magicznych liczb w samych plikach do rozróżnienia i używa tylko rozszerzeń plików jako planu awaryjnego. (Wszystkie pliki PNG zaczynają się 89 50 4E 47 0D 0A 1A 0A na przykład od bajtów , bez względu na to, jak je nazwiesz). Byłoby miło, gdyby system Windows mógł to obsługiwać, ale prawdopodobnie bardzo trudne do wdrożenia. Może coś prostszego, jak rozszerzenie drugiego poziomu, takie jak filename.program1.schi filename.program2.sch? Może jakiś filtr, który zmienia nazwy plików w locie?

Lepszy pomysł: kojarzenie niejednoznacznego rozszerzenia z preprocesorem (plik .bat lub dedykowana aplikacja), który sprawdza rozszerzenie drugiego poziomu lub przechodzi do samego pliku i skanuje w poszukiwaniu magicznej liczby, a następnie uruchamia odpowiedni program?


1
TrID może Cię zainteresować - ma bazę 4400 podpisów binarnych.
josh3736

Pamiętam, że zdarzało się to w systemie operacyjnym RISC, ale czasami powodowało frustrację, gdy masz wiele aplikacji, które mogą przetwarzać ten sam typ pliku i otwiera program z niewłaściwym programem!
Matt Wilko

Odpowiedzi:


9

System Windows nie uruchamia plików na podstawie żadnych informacji w pliku - zbudowanie bazy danych zajęłoby niewiarygodnie dużo pracy i programowania. Jedynym prawdziwym sposobem na identyfikację pliku są podpisy binarne w pliku, nawet jeśli plik go zawiera, i to zależy od autora oprogramowania do wdrożenia.

W systemie Windows pliki są przekazywane do programu określonego dla określonego rozszerzenia pliku. System Windows określa rozszerzenie pliku jako podciąg, który następuje po ostatnim wystąpieniu kropki, więc nie jest to możliwe w przypadku opublikowanych nazw plików.

Musisz albo zmienić nazwę plików (i nadać im unikalne rozszerzenia), albo napisać plik wsadowy, aby uruchomić odpowiednią aplikację. Aby uzyskać więcej informacji, zobacz ten artykuł Technet .


1
Próbowałem to zrobić, tworząc unikalne rozszerzenie pliku, ale nawet gdyby to zrobił, prawdziwy problem polega na tym, że większość programów rozpoznaje własne rozszerzenia pomimo zawartości i i tak ich nie otwiera.
KCotreau

2
Chciałbym jednak, żeby ktoś to zrobił. Myślę, że sposobem na obejście tego jest posiadanie jednego programu otwartych plików wszystkich rozszerzeń i posiadanie przez ten program własnej bazy danych (przy użyciu alternatywnych strumieni NTFS do śledzenia plików) i uruchamianie każdego odpowiedniego programu zdefiniowanego przez użytkownika każdy plik. To nie byłoby tak dużo pracy, ale widzę wiele problemów z tym podejściem, więc prawdopodobnie dlatego nikt tego nie zrobił.
Sasha Chedygov

2
to nie byłoby ZBYT trudne - istnieją narzędzia, które to robią (trid lub plik), a większość plików opartych na POSIX-ach patrzy na nagłówki plików, a nie na rozszerzenia. To w mniejszym stopniu kwestia wyboru projektu niż nakładu pracy. Oczywiście byłoby to o wiele trudniejsze dla strony trzeciej, ale gdyby stwardnienie rozsiane uznało, że jest to potrzebne, może to być trywialne
Journeyman Geek

3
„Korzystanie z alternatywnych strumieni NTFS do śledzenia plików.” Jest dla mnie oczywiste, dlaczego Windows nie implementuje modelu Linux / POSIX. Po prostu wymaga odczytu pliku. W takim przypadku za każdym razem, gdy klikniesz plik prawym przyciskiem myszy, musi on odpalić kosztowny odczyt pliku. Co gorsza, wyobraź sobie, że był to plik sieciowy, a połączenie miało zauważalne opóźnienie. Ludzie po prostu obwiniliby WinDoze. Raymond Chen bawi się tą techniką, ponieważ spowoduje, że plik zostanie przywołany, jeśli będzie on w trzeciorzędnym obszarze przechowywania.
surfasb

1
Ale system Windows pozwala przełamać ten model. . .
surfasb

8

Sam to rozwiązałem:

Stworzyłem skrypt w języku Python, który odczytuje kilka pierwszych bajtów pliku i porównuje je ze słownikiem, a następnie uruchamia odpowiedni program na podstawie magicznych liczb.

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

Najnowsza wersja będzie tutaj: Uruchom niejednoznaczne pliki w odpowiednim programie

Próbowałem powiązać rozszerzenie pliku z tym skryptem, ale Windows 7 mi na to nie pozwolił. Po prostu skojarzyło to go z Pythonem, więc wszedłem do rejestru i ręcznie dodałem nazwę skryptu.

Jak powiązać rozszerzenie pliku ze skryptem Python

Pokój do poprawy, ale działa. Mogę kliknąć dwukrotnie różne pliki z tym samym rozszerzeniem .sch i otwierają się w różnych aplikacjach.

Aktualizacja: przekonwertowałem go na plik .exe przy użyciu cx_freeze, z zewnętrznym plikiem konfiguracyjnym YAML, i łatwo go powiązać. Zobacz także tę propozycję libmagiczną . Nie jestem pewien, czy powinienem zrobić z tego pełnoprawny „program uruchamiający libmagic dla systemu Windows”, czy też lepiej jest obsługiwać tylko jedno rozszerzenie pliku z jednym .exe i prostym plikiem YAML.


2
Pisanie jako exe byłoby w rzeczywistości trywialne. . .
surfasb

Nie, jeśli nie wiesz, jak pisać exe :)
endolith

1
To nie było dla ciebie pukanie. To było coś dla mnie :)
surfasb

@surasb: Więc napisałeś mi już .exe? To banalne, prawda? :)
endolith,

Zapomniałem na śmierć! Przez ostatni tydzień bałaganiłem siatkami 3D w Silverlight. Później wieczorem, po tym, jak zaopiekuję się tą macierzą RAID. . .
surfasb

3

Aby rozpocząć, możesz zmienić nazwę jednego z typów plików, aby mieć nowe rozszerzenie, i użyć okna dialogowego „otwórz za pomocą”, aby ustawić domyślny program do otwierania tego rodzaju plików.

Nie rozwiązuje to jednak problemu zmiany nazwy. Ale upraszczasz rzeczy, tworząc specjalny folder, w którym umieszczasz wszystkie pliki z jednego z programów. Następnie możesz napisać skrypt, aby automatycznie zmieniać nazwy plików w tym folderze na nowe rozszerzenie pliku.

Możesz mieć problemy z dialogiem „Otwórz plik” w swoim programie, w zależności od jego konfiguracji. Ale jeśli masz jeden folder, w którym znajdują się wszystkie twoje pliki, powinieneś być w stanie po prostu z niego korzystać.

Bardziej skomplikowanym, ale potencjalnie lepszym sposobem byłoby stworzenie programu proxy. Zachowaj wszystkie rozszerzenia plików, ale niech zostaną otwarte przez program proxy. Poproś twój program o sprawdzenie pliku binarnego i wybranie, który typ pliku to jest i który program uruchomić. Będzie to wymagało poświęcenia czasu na napisanie programu, co może, ale nie musi być tego warte.


Tak, ale użycie zupełnie innego rozszerzenia oznacza, że ​​często nie można otwierać plików z poziomu programów.
endolith,

tak, wskazałem na to. Druga metoda, którą zasugerowałem, nie będzie miała tego problemu.
Joel

2

Microsoft Visual Studio wdraża twój ostatni pomysł. Po uruchomieniu pliku .sln mały kod pośredniczący sprawdza numer wersji rozwiązania i uruchamia prawidłową wersję programu Visual Studio (jeśli masz zainstalowanych wiele wersji).

Oczywiście koordynacja tutaj jest nieco łatwiejsza, ponieważ (A) format pliku jest do tego przeznaczony i (B) wszystkie są wersjami tego samego oprogramowania od tego samego producenta.


1

Szybkim rozwiązaniem jest dodanie dodatkowych pozycji kontekstowych do menu kontekstowego eksploratora. Lub użyć wpisu kontekstowego „otwórz za pomocą”. Pierwszy jest wygodniejszy, ponieważ można dodawać parametry połączeń i określać nazwy „mówiące”. Pozwala również na otwarcie pliku z różnymi wersjami tego samego programu (jeśli jest zainstalowany równolegle).

Oczywiście to podejście nie jest automatyczne. Trzeba znać właściwą aplikację. Ale w przypadku typów plików, w których wykrywanie baz danych nie powiodło się (np. Pliki tekstowe lub inne pliki bez „magicznej liczby”), zawsze masz wybór.

BTW: Mniej znany system operacyjny „GEOS” (który był konkurentem Win3 w swoim tiemi i daleko przed nim) miał stały nagłówek 256 bajtów dla wszystkich plików, w których aplikacja tworząca, ikona informacji o prawach autorskich były przechowywane (wraz z wolnym polem dla własne notatki). Ponieważ była to część pliku, a nie system plików lub słownik systemu operacyjnego, było przezroczyste, gdy pliki były przenoszone między systemami plików lub nawet do innego systemu operacyjnego (istniało rozszerzenie eksploratora dla W95).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.