Как узнать путь к файлу, вызванному открытием файла с пользовательским расширением?
-
19-08-2019 - |
Вопрос
Как узнать местоположение файла, с помощью которого я открывал свои программы? Р>
Пример: если я создаю новое расширение " .xyz " сказать и я говорю Windows, что я хочу открыть тип файла .xyz с myapplication, затем он запускает мое приложение. Отлично, но как мое приложение получает указатель на путь к файлу, который использовался для его запуска?
Кроме того, есть ли способ сохранить только одну версию моего приложения и открыть новые файлы, чтобы просто вызывать метод в моем приложении? Например, если вы используете торрент и открываете 5 .torrent-файлов, все они просто передаются в одно приложение.
Дополнительный вопрос: все ли расширения файла состоят из 3 букв и есть ли список тех, которые используются публично? Если я создаю расширение файла, я не хочу использовать тот, который уже используется.
Решение
Когда вы создали файловую ассоциацию, вы указали командную строку, которую должен запустить Explorer, чтобы активировать вашу программу. Оболочка также помещает имя файла документа в командную строку, поэтому в вашей программе проверьте аргументы командной строки . Как вы это сделаете, зависит от вашего языка и среды разработки. В Delphi используйте ParamCount
и ParamStr
functions.
Когда вы создаете файловую ассоциацию, вы можете указать, где именно в командной строке должно находиться имя файла документа. Используйте %1
где-нибудь в командной строке, и оболочка заменит его именем файла. Поскольку имена файлов Windows часто содержат пробелы, вы должны ставить кавычки вокруг имени файла, чтобы командная строка в ассоциации файлов выглядела так:
ArthurApp.exe "%1"
При таком сопоставлении двойной щелчок по другому файлу документа запустит другой экземпляр вашей программы. Если вы предпочитаете, чтобы документ открывался в другом окне уже запущенного экземпляра, вы можете написать код, который заставит вашу программу искать уже запущенные экземпляры при запуске. Если он находит его, он может связаться с этим экземпляром, чтобы сообщить ему, какой файл открыть. Вы можете осуществить эту связь любым количеством способов, включая почтовые слоты, сокеты, именованные каналы, отображенные в память файлы и DDE.
Механизм связывания файлов оболочки уже имеет способ связи через DDE, поэтому второй экземпляр вашей программы вообще не будет запущен. Вместо этого оболочка запускает диалог DDE с уже запущенным экземпляром и таким образом сообщает ему новое имя файла. Тем не менее, в настоящее время DDE, похоже, перестает пользоваться популярностью, поэтому сначала проверьте некоторые другие варианты.
Ваш дополнительный вопрос: нет, расширения не всегда состоят из трех символов. Посмотрите вокруг, и это должно быть очевидно: код C помещается в файлы .c , графика Adobe Illustrator помещается в файлы .ai , а новые документы Microsoft Word помещаются в .docx файлы.
Но будьте осторожны. Если вы запросите **. Doc *, результаты будут также включать файлы .docx . Это связано с тем, что FindFirstFile
соответствует как коротким, так и длинным именам файлов, а длинные имена файлов с длинными расширениями имеют трехсимвольные расширения в версиях с короткими именами файлов.
Другие советы
Роб красиво ответил на ваши вопросы.
Что касается последней части, существует ли публичный список расширений файлов - не как таковой, но есть shell.windows.com, который использует веб-служба Explorer для поиска обработчиков для неизвестных расширений файлов. Вы можете создать расширение, а затем запросить shell.windows.com, чтобы увидеть, было ли оно зарегистрировано. Например, чтобы проверить, зарегистрировано ли расширение .blah
кем-либо на shell.windows.com, просто откройте этот URL в любом браузере:
http://shell.windows.com/fileassoc /0409/xml/redir.asp?ext=blah р>
Конечно, замените трейлинг blah
своим расширением.
Подробнее об этом можно прочитать в KB929149 и в посте Рэймонда Чена Где shell.windows.com получает информацию о расширениях файлов и как мне это сделать принять участие в этом действии? .