Змусьте Windows по-різному обробляти файли з тим самим розширенням


10

Кілька програм використовують одне розширення файлів, але формати абсолютно різні та несумісні. Наприклад, у мене .schна комп'ютері є файли принаймні у 5 різних форматах (TINA, PSpice, PADS, Protel та Eagle). Чи є спосіб змусити Windows по-різному ставитися до них, так що подвійне клацання на такий файл відкриває його в програмі, в якій він повинен бути відкритий?

Linux використовує магічні числа в самих файлах для розмежування і використовує лише розширення файлів як резервний план. ( Наприклад, усі файли PNG починаються з байтів 89 50 4E 47 0D 0A 1A 0A , незалежно від того, що ви їх назвали.) Було б добре, якби Windows могла це підтримати, але, ймовірно, дуже важко реалізувати. Може щось простіше, як розширення другого рівня, як filename.program1.schі filename.program2.sch? Може, якийсь фільтр, який перейменовує файли на льоту?

Краща ідея: асоціювати неоднозначне розширення з попереднім процесором (файлом .bat або спеціальним додатком), який перевіряє розширення другого рівня або переходить у сам файл і сканує магічне число, а потім запускає відповідну програму?


1
TrID може вас зацікавити - він має базу даних з 4400 двійкових підписів.
josh3736

Я пам’ятаю, що це траплялося в операційній системі RISC, але іноді використовується для розчарування, коли у вас було кілька програм, які могли обробляти один і той же тип файлу, і це відкривало б програму з неправильною програмою!
Метт Вілько

Відповіді:


9

Windows не запускає файли на основі будь-якої інформації у файлі - для створення бази даних це займе неймовірну кількість роботи та програмування. Єдиний вірний спосіб визначити файл - це двійкові підписи у файлі, якщо у нього навіть є, і це залежить від автора програмного забезпечення.

У Windows файли передаються програмі, яку ви вказали для конкретного розширення файлу. Windows визначає розширення файлу як підрядку, яка слідує за останнім виникненням періоду, тому неможливо з опублікованими вами іменами файлів.

Вам потрібно або перейменувати файли (і надати їм унікальні розширення файлів), або написати пакетний файл, щоб запустити відповідну для вас програму. Детальніше дивіться у цій статті Technet .


1
Я намагався зробити цю роботу, створивши унікальне розширення файлів, але навіть якщо він це зробив, справжня проблема полягає в тому, що більшість програм розпізнає лише власні розширення, незважаючи на вміст, і не відкриватиме їх у будь-якому разі.
KCotreau

2
Я хотів би бачити, як це хтось робить. Я думаю, що так, як ви його обійшли, - це мати єдину програму відкритих файлів усіх розширень, а програма повинна зберігати власну базу даних (використовуючи альтернативні потоки NTFS для відстеження файлів) та запускати кожну відповідну програму, яку визначає користувач. кожен файл. Це не було б , що багато роботи, але я бачу багато проблем з цим підходом, так що, ймовірно , чому ніхто не зробив це.
Саша Чедигов

2
це не було б важко - є інструменти, які роблять це (trid або файл), а більшість осей на основі позі дивляться на заголовки файлів, а не на розширення. Це менше питання дизайнерського вибору, ніж кількість зусиль, які потрібно докласти. Звичайно, це було б набагато складніше для третьої сторони, але якщо MS вважає, що це потрібно, це може бути напівтривіальним
Journeyman Geek

3
"Використання альтернативних потоків NTFS для відстеження файлів." Для мене очевидно, чому Windows не реалізує модель Linux / POSIX. Просто те, що для цього потрібно прочитати файл. Якщо це було так, кожен раз, коли ви правою кнопкою миші клацали файл, він повинен запускати дорогий файл, прочитаний. Ще гірше, уявіть, якщо це був мережевий файл, а з'єднання мало помітне відставання. Люди просто звинувачували б WinDoze. Реймонд Чен бідкався з цією методикою, також це призвело б до виклику файлу, якщо він знаходився на третинній зоні зберігання.
surfasb

1
Але Windows все ж дозволяє зламати цю модель. . .
surfasb

8

Я сам це вирішив:

Я зробив сценарій Python, який читає перші кілька байтів файлу і порівнює їх зі словником, після чого запускає відповідну програму на основі магічних чисел.

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

Остання версія буде тут: Запустіть неоднозначні файли у відповідній програмі

Я намагався пов’язати розширення файлу з цим сценарієм, але Windows 7 мені не дозволив. Це замість цього було просто пов'язано з Python, тому я зайшов у реєстр і додав ім'я сценарію вручну.

Як пов’язати розширення файлу із сценарієм Python

Кімната для вдосконалення, але вона працює. Я можу двічі клацнути різні файли з однаковим розширенням .sch, і вони відкриваються в різних додатках.

Оновлення: я перетворив його в .exe за допомогою cx_freeze, із зовнішнім файлом конфігурації YAML, і це легко пов'язати. Дивіться також цю лібмагічну пропозицію . Не впевнений, чи варто мені це зробити повноцінним "лібмагічним запуском для Windows" або якщо краще обробити лише одне розширення файлу одним .exe та простим файлом YAML.


2
Це насправді було б тривіально писати як exe. . .
surfasb

Якщо ви не знаєте, як писати exes :)
endolith

1
Це не був твій стук. Це було щось для мене :)
surfasb

@surasb: Так ти мені ще написав .exe? Це банально, правда? :)
endolith

Я зовсім забув! Я возився з 3D-сітками на Silverlight останній тиждень. Пізніше сьогодні ввечері, після того, як я няньчила цей масив RAID. . .
surfasb

3

Для початку ви можете перейменувати один із типів файлів, щоб мати нове розширення, і скористатися діалоговим вікном "відкрити з", щоб встановити програму за замовчуванням, щоб відкрити ці типи файлів.

Однак це не стосується проблеми перейменування. Але ви спрощуєте речі, створюючи певну папку, куди ви поміщаєте всі файли з однієї з програм. Тоді ви можете написати сценарій для автоматичного перейменування файлів у цій папці у ваше нове розширення.

Можливо, у вас виникнуть проблеми з діалогом "Відкрити файл" у вашій програмі, залежно від способу налаштування. Але якщо у вас є одна папка, де є всі ваші файли, ви повинні мати можливість просто використовувати її.

Більш складним, але потенційно кращим способом було б створення програми проксі. Зберігайте всі розширення файлів, але нехай їх відкриє програма проксі. Попросіть вашу програму вивчити двійковий файл і вибрати тип файлу та програму для запуску. Це вимагатиме від вас витратити деякий час на написання програми, що може вам бути, а може і не варто.


Так, але з використанням зовсім інше розширення означає , що ви часто не можете відкривати файли з всередині програм.
ендоліт

так, я це вказав. Другий метод, який я запропонував, не матиме цієї проблеми.
Джоел

2

Microsoft Visual Studio реалізує вашу останню ідею. Коли ви запускаєте файл .sln, невеликий заглушок перевіряє номер версії рішення та запускає правильну версію Visual Studio (якщо встановлено кілька версій).

Звичайно, координація тут трохи простіша, оскільки (A) формат файлу призначений для цього і (B) - всі вони версії одного програмного забезпечення від одного виробника.


1

Швидке рішення - додати додаткові записи контексту до контекстного меню Explorer. Або використовувати запис "відкрити з". Перший - це зручніше, оскільки можна додати параметри виклику та вказати імена "розповідати". Це також дозволяє відкрити файл з різними версіями тієї ж програми (якщо встановлено паралельно).

Звичайно, цей підхід не є автоматичним. Треба знати належне застосування. Але для типів файлів, де виявлення на базі даних не вдалося (наприклад, текстові файли чи інші файли без "магічного числа"), ви завжди маєте вибір.

BTW: Маловідома ОС "GEOS" (яка була конкурентом Win3 на своєму рівні і далеко вперед) мала фіксований 256-байтний заголовок для всіх файлів, де створювалося додаток, піктограма авторських прав (разом із вільним полем для власні нотатки). Оскільки це було частиною файлу, а не файловою системою чи словником ОС, воно було прозорим, коли файли переміщувались через файлові системи чи навіть в іншу ОС (було розширення Explorer для W95).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.