Как узнать путь к файлу, вызванному открытием файла с пользовательским расширением?

StackOverflow https://stackoverflow.com/questions/458467

Вопрос

Как узнать местоположение файла, с помощью которого я открывал свои программы?

Пример: если я создаю новое расширение " .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 получает информацию о расширениях файлов и как мне это сделать принять участие в этом действии? .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top