читать известные расширения / типы файлов из реестра - PullRequest
2 голосов
/ 03 октября 2010

Я хочу представить пользователю список известных расширений файлов, которые он может выбрать. Я знаю, что они хранятся в реестре под HKEY_CLASSES_ROOT, как обычно:

.txt -> (по умолчанию) = "txtfile"

где txtfile содержит информацию о связанных программах и т. Д.

К сожалению, это место в реестре также хранит множество других ключей, таких как типы файлов (например, txtfile) и записи типа

CAPICOM.Сертификаты (что бы это ни было)

Как определить, какие записи являются расширениями файлов? Или есть другой способ получить эти расширения как функцию API?

(я не думаю, что это имеет значение, но я использую Delphi для программы.)

Ответы [ 4 ]

3 голосов
/ 04 октября 2010

Нет гарантии, что все ключи, которым предшествует точка в HKEY_CLASSES_ROOT, предназначены для ассоциации файлов, но каждая ассоциация файлов требует создания ключа, которому предшествует точка.См. MSDN по теме Типы файлов .

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

Чтобы достичь этого, вам нужно будет выполнить сложные шаги следующим образом:

  1. Перечисление всех ключейдля этого перед точкой . вы можете использовать RegQueryInfoKey () и RegEnumKeyEx ().

  2. В каждом ключе, которому предшествует точка, посмотрите данные по умолчанию:

    a. Если значение по умолчанию не пусто , , этого достаточно для указания того, что «предыдущая точка» предназначена для сопоставления файлов во всех Windows NTверсия , затем попробуйте открыть имя ключа, как указано в данных значения, просто говорит TheKeyNameMentioned .

    a1) Если есть подключей shell\open\command в TheKeyNameMentioned , затем проверьте существование пути, указанного значением по умолчанию этого ключа;если путь существует, существует приложение по умолчанию, связанное с расширением;если путь не существует, приложение по умолчанию неизвестно.Чтобы получить описание расширения файла, посмотрите значение по умолчанию TheKeyNameMentioned .Чтобы получить описание программы, сначала проверьте, содержит ли следующий ключ значение-имя, равное пути к файлу EXE, то есть HKCR\Local Settings\Software\Microsoft\Windows\Shell\MuiCache.Если оно есть, посмотрите на данные значения, чтобы получить описание файла;если его там нет, используйте GetFileVersionInfo () напрямую, чтобы получить описание файла.

    a2) Если , то нет подразделов shell\open\command в TheKeyNameMentioned, тогда приложение по умолчанию неизвестно.Чтобы получить описание расширения файла, посмотрите значение по умолчанию TheKeyNameMentioned .

    b. В Windows Vista и более поздних версиях, когда точка [a] не удается, вам нужна дополнительная проверка.Если значение по умолчанию пусто , проверьте, есть ли у ключа подключ с именем OpenWithProgIDs.

    • Если существует OpenWithProgIDs подраздел существует ,используйте RegEnumValue (), чтобы найти имя первого встреченного значения, которое соответствует критериям, то есть имя имени значения должно указывать на существующий ключ (просто говорит TheKeyNameMentioned .) сто же имя, что и имя значения.Если TheKeyNameMentioned существует, этого достаточно, чтобы указать, что «предыдущая точка» предназначена для ассоциации файлов .Для следующих шагов прочитайте точку a1 и a2 .

    • Если OpenWithProgIDs подраздел не существует ,приложение по умолчанию неизвестно.Чтобы получить описание расширения файла, посмотрите значение по умолчанию TheKeyNameMentioned .

Надеюсь, что это поможет.: -)

1 голос
/ 13 февраля 2012

Для альтернативы командной строки программа командной строки assoc , включенная в Windows, показывает зарегистрированные расширения файлов.

c:\> assoc
.3g2=VLC.3g2
.3gp=VLC.3gp
.3gp2=VLC.3gp2
.3gpp=VLC.3gpp
...

Я не уверен, какой глагол это ищет. Open возможно? Я также не уверен, какие расширения появятся в этом списке. Возможно расширение файлов, которые можно открыть из командной строки.

Чтобы узнать, какой исполняемый файл сопоставлен с каждым типом файла, команда ftype скажет:

c:\> ftype VLC.3g2
VLC.3g2="c:\vlc.exe" --started-from-file "%1"
0 голосов
/ 04 октября 2010

Я не знаю деталей, но, похоже, вы могли бы использовать IQueryAssociations интерфейс .

0 голосов
/ 03 октября 2010

IMHO - все эти подразделы реестра, начинающиеся с точки (.), - для расширений файлов.

Например, в вашем случае .txt обозначает расширение "txt", тогда как txtfileне начинается с точки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...