Одна из наиболее поганых особенностей винды (не считая, конечно, её проприетарности) — это маниакальная привязанность обработки файлов к их расширению. Файлы с неизвестными расширениями — не открываются, не запускаются. Файлы без расширений — не открываются, не запускаются. Файлы с неправильно проставленным расширением — открываются неправильно и не запускаются нормально.
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), так что это не должно стать проблемой) включены в архив с бинарниками.
Буду признателен, если кто-то протестирует на системах отличных от Win 7 x64. Работать вроде должно — но практика показала, что «должно» и «объективная реальность» редко совпадают.
«Открыть с помощью» доступно только в эксплорэре, из командной строки ею не воспользуешься. В частности, когда ты в Питоне делаешь subprocess.Popen(['c:/myexecutablefile'], shell=True), ты получаешь мужской половой орган вместо запуска файла c:/myexecutablefile
Ну, а про слежение за правильностью расширений (кстати, как проверить, что расширение — правильное? А если файл получен извне?) я вообще молчу — нафига мне такая радость? Да и если можно сломать все ассоциации тупым переименованием файла…
Рус, а в чем профит использования сей штуки с линуксовыми путями? В моей уютненькой бубунте файлы и так независимо от расширения отрабатываются.
Тоесть этот костыль токмо для винды, имхо.
Про wine я таки не думал, поскольку, насколько я помню, виндовые приложения продолжают думать своими неправильными слешами и буквами дисков. Так что и там это не особо нужно.
М-м-м… на самом деле большинство функций WinAPI прекрасно понимают пути файловой системы с '/' в качестве разделителя директорий (правда, расширенные пути, которые начинаются с \\?\, не позволяют использовать слэши; хотя опять же, то, что поддерживает WinAPI, не обязательно поддерживаетс шэллом, а тестировал я именно в шэлле — лень возиться с CreateFile()).
'c:/myexecutablefile' в одном из комментариев я написал чисто по эстетическим соображениям (ну не люблю я эскейпить бэкслэши...).
держи расширения файлов в порядке
прямо лозунгНу, а про слежение за правильностью расширений (кстати, как проверить, что расширение — правильное? А если файл получен извне?) я вообще молчу — нафига мне такая радость? Да и если можно сломать все ассоциации тупым переименованием файла…
Опять же, шибанги — вещь.
Тоесть этот костыль токмо для винды, имхо.
Про wine я таки не думал, поскольку, насколько я помню, виндовые приложения продолжают думать своими неправильными слешами и буквами дисков. Так что и там это не особо нужно.
'c:/myexecutablefile' в одном из комментариев я написал чисто по эстетическим соображениям (ну не люблю я эскейпить бэкслэши...).