Блог им. LRNMimerun - открываем/запускаем файлы согласно их типу

Одна из наиболее поганых особенностей винды (не считая, конечно, её проприетарности) — это маниакальная привязанность обработки файлов к их расширению. Файлы с неизвестными расширениями — не открываются, не запускаются. Файлы без расширений — не открываются, не запускаются. Файлы с неправильно проставленным расширением — открываются неправильно и не запускаются нормально.

Mimerun — это попытка решить данную проблему.
Сырцы и бинарники — на Гитхабе
Документация — там же, в docs/README

В основе mimerun — библиотека, реализующая интерфейс IShellExecuteHook, позволяющий добавить себя в цепочку обработки вызовов ShellExecute() и ShellExecuteEx(). Это значит, что mimerun легко и непринуждённо цепляется к любому процессу, который хоть что-то запускает помимо exe-файлов.

Как только вызов перехвачен (и определено, что вызывается действительно файл, и что файл существует), mimerun резво взывает к помощи libmagic, дабы выжать из открваемого файла информацию о его типе (вопреки названию утилиты, информация включает в себя не только mime-type). После чего сверяет полученную информацию с набором правил, которые хранятся в mimerun'овской ветке реестра, и в случае совпадения запускает нужную программу с нужными аргументами (естественно подставляя нужным образом имя открываемого/запускаемого файла).

Вот, в общем-то, вся суть процесса. Все навороты — это обработка всяких крайних случаев, догонка под особенности поведения эксплорэра — при даблклике, cmd — при вызове и т.д. В частности, если правило не найдено, mimerun не станет препятствовать дальнейшей обработке вызова шэллом какими-то своими способами (и с помощью других хуков).

Mimerun понимает шибанги и, при выставленных в правиле шибанг-флагах, будет использовать обозначенный в шибанге коммандлайн для запуска интерпретатора. Пути пока что поддерживаются только виндовые, поэтому работоспособны только шибанги типа "#!c:\python26\python.exe". Есть некоторые идеи относительно обработки *nix'овских путей, но это где-то в отдалённом будущем.

При прописывании в реестр (силами утилиты mimerunreg) в качестве примера добавляются два правила: одно — которое запускает вообще любые файлы исключительно по их шибангам, второе — которые запускает любые файлы, идентифицирующиеся как text/plain, с помощью notepad'а.

Сырцы заточены (и бинарники собраны) под x86 и x64 (ибо у самого 64-битная система, без 64-битного варианта подцепление к 64-битным процессам не работает). Соответствующие билды библиотек и файл с шаблонами для libmagic (кстати говоря, libmagic нужен пропатченный, но патчи уже закоммитчены в file(1), так что это не должно стать проблемой) включены в архив с бинарниками.
  • +12
  • LRN
  • 15 августа 2010, 21:52

Комментарии (11)

Файлы с неизвестными расширениями — не открываются
правой кнопкой и открыть с помощью...
Файлы с неправильно проставленным расширением
держи расширения файлов в порядке прямо лозунг
  • avatar
  • fog
  • 15 августа 2010, 22:59
  • #
  • 0
Ух ты, полезная штука! Спасибо, LRN!
Буду признателен, если кто-то протестирует на системах отличных от Win 7 x64. Работать вроде должно — но практика показала, что «должно» и «объективная реальность» редко совпадают.
  • avatar
  • LRN
  • 15 августа 2010, 23:00
  • #
  • 2
«Открыть с помощью» доступно только в эксплорэре, из командной строки ею не воспользуешься. В частности, когда ты в Питоне делаешь subprocess.Popen(['c:/myexecutablefile'], shell=True), ты получаешь мужской половой орган вместо запуска файла c:/myexecutablefile

Ну, а про слежение за правильностью расширений (кстати, как проверить, что расширение — правильное? А если файл получен извне?) я вообще молчу — нафига мне такая радость? Да и если можно сломать все ассоциации тупым переименованием файла…

Опять же, шибанги — вещь.
Чёрт, не туда комментарий запостил. Ну, из конткекста вроде ясно, кому я отвечаю.
Полезно, доберусь в windows — посмотрю (а сначала подумал что замену xdg-open придумали :) ).
Рус, а в чем профит использования сей штуки с линуксовыми путями? В моей уютненькой бубунте файлы и так независимо от расширения отрабатываются.
Тоесть этот костыль токмо для винды, имхо.
Костыль воистину только для винды (ну, разве что под бубунтой можно писать шэлл хуки на COM… Или ты про Wine подумал?).
ZOMG! COM в моей бубунте! Нет пути! 0_0

Про wine я таки не думал, поскольку, насколько я помню, виндовые приложения продолжают думать своими неправильными слешами и буквами дисков. Так что и там это не особо нужно.
М-м-м… на самом деле большинство функций WinAPI прекрасно понимают пути файловой системы с '/' в качестве разделителя директорий (правда, расширенные пути, которые начинаются с \\?\, не позволяют использовать слэши; хотя опять же, то, что поддерживает WinAPI, не обязательно поддерживаетс шэллом, а тестировал я именно в шэлле — лень возиться с CreateFile()).

'c:/myexecutablefile' в одном из комментариев я написал чисто по эстетическим соображениям (ну не люблю я эскейпить бэкслэши...).
Ну в общем и целом полезная затея, хотя винда лично мне не нужна. =)
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.