Попросите 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, но иногда вызывало разочарование, когда у вас было несколько приложений, которые могли обрабатывать файлы одного типа, и это открывало программу с неверной программой!
Мэтт Вилко
@Matt: Отлично, спасибо! file-extension.net/seeker/file_extension_sch
эндолиты

Ответы:

9

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

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

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

Прорвать
источник
1
Я пытался заставить эту работу создать уникальное расширение файла, но даже если бы он это сделал, реальная проблема заключается в том, что большинство программ распознают только свои собственные расширения, несмотря на содержимое, и не открывают их в любом случае.
Котро
2
Я хотел бы видеть, что кто-то делает это, все же. Я думаю, что вы могли бы обойти это, если бы у одной программы были открыты файлы всех расширений, и чтобы эта программа сохраняла свою собственную базу данных (используя альтернативные потоки NTFS для отслеживания файлов) и запускала каждую соответствующую программу, для которой пользователь определил каждый файл. Это не было бы такой большой работой, но я вижу много проблем с этим подходом, поэтому, вероятно, почему никто не сделал этого.
Саша Чедыгов
2
это не будет СЛИШКОМ тяжело - есть инструменты, которые делают это (trid или file), и большинство основанных на posix oses смотрят на заголовки файлов, а не на расширения. Это меньше вопрос выбора дизайна, чем количество усилий, которое потребуется. Естественно, это было бы намного сложнее для третьей стороны, но если 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, и его легко связать. Смотрите также это libmagic предложение . Не уверен, стоит ли мне превращать это в полноценный «libmagic launcher for Windows» или лучше обрабатывать только одно расширение файла с одним .exe и простым YAML-файлом.

эндолиты
источник
2
На самом деле это было бы тривиально, чтобы написать как exe. , ,
Surfasb
Нет, если ты не умеешь писать exes :)
endolith
1
Это был не стук в тебя. Это было что-то для меня :)
surfasb
@surasb: Так ты уже написал мне .exe? Это тривиально, правда? :)
эндолит
Я полностью забыл! На прошлой неделе я возился с 3D-сетками на Silverlight. Позже сегодня вечером, после того, как я буду нянчить этот массив RAID. , ,
Surfasb
3

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

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

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

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

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

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

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

MSalters
источник
1

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

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

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

Питер Пейнтер
источник