2010-10-03 3 views
2

Je souhaite présenter à l'utilisateur une liste d'extensions de fichiers connues qu'il peut choisir. Je sais que ceux-ci sont stockés dans le Registre sous HKEY_CLASSES_ROOT généralement comme ceci:lire les extensions/types de fichiers connus du registre

txt -> (par défaut) = « txtfile »

où txtfile contient alors les informations sur les programmes associés, etc.

Malheureusement cet endroit dans le registre stocke également beaucoup d'autres clés, comme les types de fichiers (par exemple txtfile) et les entrées comme

CAPICOM.Certificates (quelle qu'elle soit)

Comment puis-je déterminer lequel des fr les tentatives sont des extensions de fichier? Ou existe-t-il un moyen différent d'obtenir ces extensions comme une fonction API?

(je ne pense pas que cela importe, mais je suis en utilisant Delphi pour le programme.)

+0

Juste au cas où quelqu'un est intéressé, c'est ce que j'ai finalement écrit: http://sourceforge.net /p/dzlib/code/125/tree/dzlib/trunk/src/u_dzFileTypes.pas Soyez averti que c'est pour l'instant non testé. – dummzeuch

Répondre

3

Il n'y a aucune garantie que chaque clé précédée d'un point dans HKEY_CLASSES_ROOT est destinée à l'association de fichier, mais chaque association de fichier nécessite la création d'une clé précédée d'un point. Voir MSDN sur le sujet File Types. Autant que je le sache, la méthode que je décris ici est conforme à la manière dont fonctionne la fonction Windows Définir les associations de fichiers pour obtenir une liste de tous les types de fichiers connus. C'était basé sur mon observation précédente quand j'ai plongé dans ce sujet.

Pour ce faire, vous aurez besoin de faire des étapes complexes comme suit:

  1. Énumérer toutes les clés précédés d'un point ., vous pouvez utiliser RegQueryInfoKey() et RegEnumKeyEx() à cet effet.

  2. Dans toutes les clés précédés d'un point, regardez les données de valeur par défaut:

    a. Si la valeur par défaut est non vide, cela indique que la "clé de point précédente" est destinée à l'association de fichiers dans toutes les versions de Windows NT, puis essayez d'ouvrir le nom de clé comme indiqué par les données de valeur, juste dit TheKeyNameMentioned.

    a1) Si il y ashell\open\command sous les sous-clés TheKeyNameMentioned, puis tester l'existence du chemin indiqué par la valeur par défaut de cette clé; si le chemin existe, il existe une application par défaut associée à l'extension; Si le chemin n'existe pas, l'application par défaut est inconnue. Pour obtenir la description de l'extension de fichier, regardez la valeur par défaut de TheKeyNameMentioned.Pour obtenir la description du programme, commencez par tester si la clé suivante contient un nom de valeur égal au chemin du fichier EXE, à savoir HKCR\Local Settings\Software\Microsoft\Windows\Shell\MuiCache. Si c'est le cas, regardez les données de valeur pour obtenir la description du fichier; Si ce n'est pas le cas, utilisez directement GetFileVersionInfo() pour obtenir la description du fichier.

    a2) Si il n'y a passhell\open\command sous les sous-clés TheKeyNameMentioned, l'application par défaut est inconnue. Pour obtenir la description de l'extension de fichier, regardez la valeur par défaut de TheKeyNameMentioned.

    b. Sous Windows Vista et versions ultérieures, lorsque le point [a] échoue, vous devez effectuer une vérification supplémentaire. Si la valeur par défaut est vide, vérifiez si la clé possède une sous-clé nommée OpenWithProgIDs.

    • Si OpenWithProgIDs sous-clé existe, utilisez RegEnumValue() pour trouver le premier nom de la valeur rencontrée qui répond aux critères, c'est le nom du nom de la valeur doit pointer vers une clé existante (juste dit TheKeyNameMentioned.) Avec le même nom que le nom de la valeur. Si TheKeyNameMentioned existe, ceci est une indication suffisante que la "clé de point précédente" est destinée à l'association de fichier. Lire le point a1 et a2 pour les étapes suivantes.

    • Si OpenWithProgIDs la sous-clé n'existe pas, l'application par défaut est inconnue. Pour obtenir la description de l'extension de fichier, regardez la valeur par défaut de TheKeyNameMentioned.

espoir qui aide. :-)

+0

J'ai apporté quelques informations supplémentaires à ma réponse. – Vantomex

+1

Ne vous fiez pas uniquement à la sous-clé 'shell \ open \ command'. Tout nom de verbe personnalisé peut être enregistré sous la clé 'shell', pas seulement' open', et tous les verbes n'utilisent pas la sous-clé 'command', certains utilisent plutôt la sous-clé' ddeexec' ou 'DropTarget'. –

+0

Il semble y avoir une autre option: Si la valeur par défaut de TheKeyNameMentioned est vide, il peut y avoir une valeur FriendlyTypeName qui contient le nom du type. Et pire encore, ce nom de type peut pointer vers une chaîne de ressources. Voir l'entrée de PerfFile (.pma) pour un exemple. Voir aussi http://msdn.microsoft.com/en-us/library/windows/desktop/dd374120(v=vs.85).aspx – dummzeuch

0

mon humble avis - tous les sous-clés registre commençant par le point (.) - sont des extensions de fichiers. Par exemple, dans votre cas, .txt représente l'extension "txt", tandis que txtfile ne commence pas par le point.

+0

Est-ce votre hypothèse (j'ai deviné cela aussi) ou est-ce documenté quelque part? J'ai trouvé la documentation pour HKEY_CLASSES_ROOT dans MSDN mais il n'a pas précisé quelles entrées sont des extensions et lesquelles ne le sont pas. – dummzeuch

+0

Ceci est ma "supposition scientifique". J'ai essayé d'ajouter une nouvelle sous-clé sous HKEY_CLASSES_ROOT en commençant par dot. Puis ajouté les choses correspondantes, et finalement appelé «SHChangeNotify». Et - voilà! Cela a fonctionné! – valdo

+0

Mon impression est que "txtfile" est un niveau d'indirection. Vous pouvez avoir par exemple "txtfile" et plusieurs entrées pointées vers lui, par ex. ".txt", ".ini", ".csv" qui pointent alors tous vers "txtfile" où les paramètres partagés sont stockés. –

1

Pour une alternative de ligne de commande, le programme de ligne de commande assoc inclus dans Windows affiche les extensions de fichier enregistrées.

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

Je ne suis pas sûr du verbe recherché. Open peut-être? Je ne suis pas sûr non plus quelles extensions apparaîtront dans cette liste. Peut-être les extensions de fichiers qui peuvent ouvrir à partir de la ligne de commande.

Pour puis trouver l'exécutable est mis en correspondance avec chaque type de fichier, la commande ftype nous dira:

c:\> ftype VLC.3g2 
VLC.3g2="c:\vlc.exe" --started-from-file "%1" 
+0

A appris quelque chose de nouveau aujourd'hui ... Pour ceux qui se demandent: Cette commande existe déjà dans Windows XP. – dummzeuch

Questions connexes