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 или специальное приложение), который проверяет расширение второго уровня или входит в сам файл и сканирует магическое число, а затем запускает соответствующую программу?

5 ответов5

9

Windows не запускает файлы на основе какой-либо информации в файле - создание базы данных для этого потребует невероятного количества работы и программирования. Единственный верный способ идентифицировать файл - это использовать двоичные сигнатуры в файле, если он есть в файле, и это зависит от автора программного обеспечения.

В Windows файлы передаются в программу, указанную вами для определенного расширения файла. Windows определяет расширение файла как подстроку, которая следует за последним вхождением периода, поэтому это невозможно с именами файлов, которые вы опубликовали.

Вы должны либо переименовать файлы (и дать им уникальные расширения файлов), либо написать командный файл, чтобы запустить соответствующее приложение для вас. Для получения более подробной информации см. Эту статью Technet.

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(len(max(magic_numbers.keys())))

subprocess.call([magic_numbers[magic_n], filename])

Последняя версия будет здесь: запускать неоднозначные файлы в соответствующей программе

Я пытался связать расширение файла с этим сценарием, но Windows 7 не позволяла мне. Он просто связал его с Python, поэтому я вошел в реестр и добавил имя сценария вручную.

Как связать расширение файла со скриптом Python

Возможности для улучшения, но это работает. Я могу дважды щелкнуть по разным файлам с одинаковым расширением .sch, и они открываются в разных приложениях.

Обновление: я преобразовал его в .exe, используя cx_freeze, с внешним файлом конфигурации YAML, и его легко связать. Смотрите также это libmagic предложение. Не уверен, стоит ли мне превращать это в полноценный "libmagic launcher for Windows" или лучше обрабатывать только одно расширение файла с одним .exe и простым YAML-файлом.

3

Для начала вы можете переименовать один из типов файлов, чтобы иметь новое расширение, и использовать диалог "открыть с", чтобы установить программу по умолчанию для открытия файлов этих типов.

Это не касается проблемы переименования. Но вы упрощаете вещи, создавая специальную папку, куда вы помещаете все файлы из одной из программ. Затем вы можете написать скрипт для автоматического переименования файлов в этой папке в новое расширение файла.

У вас могут возникнуть проблемы с диалогом "Открыть файл" в вашей программе, в зависимости от того, как он настроен. Но если у вас есть одна папка, в которой находятся все ваши файлы, вы можете просто использовать ее.

Более сложным, но потенциально лучшим способом было бы создать прокси-программу. Сохраните все расширения файлов, но прокси-программы должны открыть их. Пусть ваша программа проверит двоичный файл и выберет тип файла и какую программу запустить. Это потребует от вас потратить некоторое время на написание вашей программы, которая может или не может стоить вам.

2

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

Конечно, координация здесь немного проще, поскольку (A) формат файла предназначен для этого и (B) это все версии одного и того же программного обеспечения от одного производителя.

1

Быстрое решение - добавить дополнительные контекстные записи в контекстное меню проводника. Или использовать контекстную запись «открыть с». Первый удобнее, так как можно добавить параметры вызова и указать «говорящие» имена. Это также позволяет открыть файл с разными версиями одной и той же программы (если установлена параллельно).

Конечно, этот подход не является автоматическим. Нужно знать правильное применение. Но для типов файлов, где обнаружение на основе базы данных не будет выполнено (например, текстовые файлы или другие файлы без "магического числа"), у вас всегда есть выбор.

Кстати: менее известная ОС 'GEOS' (которая была конкурентом Win3 в то время и далеко впереди) имела фиксированный заголовок 256 байт для всех файлов, где создавалось приложение, значок, уведомления об авторских правах (вместе со свободным полем для собственные заметки). Поскольку это была часть файла, а не файловая система или словарь ОС, она была прозрачной, когда файлы перемещались по файловым системам или даже в другую ОС (для W95 было расширение обозревателя).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .