Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

OBTENIR LES INFORMATIONS RELATIVES À L'EXTENSION D'UN FICHIER


Information sur la source

Description

En developpant un site de gestion de documents, j’ai eu besoin d’obtenir l’icone associé à un type de fichier.

En soit, cela n’est pas très compliqué : on ouvre la base de registre (merci Microsoft.Win32.RegistryKey), on recupère l’information depuis HKEY_CLASSES_ROOT\{mon_extension}, on prends la valeur de la sous-clef DefaultIcon (avec le plus souvent une redirection : la valeur de la clef {mon_extension} donnant le nom d’une autre sous-clef de HKEY_CLASSES_ROOT à ouvrir). A partir de ces informations, nous pouvons determiner le path vers l’icone. Facile à écrire ! Là où ça ce complique, c’est que la plupart des icones sont contenu dans une DLL ou un EXE. Et que, à moins d’un oubli de ma part, .net ne propose pas de methode pour extraire une resource depuis un module executable.

Quelques instants passés dans mes souvenirs et l’API Windows ExtractIcon m’est apparue dans toute sa splendeur : cette fonction fait exactement ce dont j’avais besoin. Eh bien, qu’à cela ne tienne, avec un peu d’interop, on arrive à tout faire.


 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
Commentaire de Bidou le 07/05/2005 00:45:32 administrateur CS

J'ai testé ta class. L'icône que j'en ai resorti avait perdu beaucoup de ses couleurs.....

Voici mon code avec lequel j'ai testé ta class :

FileTypeInfo fti = FileTypeInfo.FromExtension(".avi");
Icon i = fti.DefaultIcon;
FileStream fs = new FileStream(@"C:\test.ico", FileMode.Create);
i.Save(fs);

signaler à un administrateur
Commentaire de mcarbenay le 09/05/2005 12:19:54

tiens, c'est marrant, moi je fais un
fti.DefaultIcon.ToBitmap() et apres je sauvegarde le bitmap, j'avais jamais essayé de sauvegarder l'icone...

quand on sauvegarde le BMP on a bien toutes les couleurs qui vont bien... (bon evidement on a un fond blanc, mais pour moi ce n'etait pas génant)

Je regarderais si je trouve comment on empeche Icon.Save de faire des conneries

signaler à un administrateur
Commentaire de Bidou le 10/05/2005 08:16:43 administrateur CS

Au cas où tu trouverais, met ta source à jour, ça en intéressera plus d'un :-)

signaler à un administrateur
Commentaire de aogie le 10/05/2005 11:21:51

Windows stocke ses icônes en 16 couleurs pour 16x16, 16 couleurs 32x32 et 256 couleurs 48x48.
Cf : http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnwui/html/msdn_icons.asp

L'API Win32 n'est pas très récente et effectivement ExtractIcon renvoie régulièrement un handle sur une icône 32x32 à 16 couleurs.
Essayer éventuellement ExtractIconEx pour essayer de récupérer les icônes 48x48 et obtenir ainsi 256 couleurs...

Concernant FileTypeInfo.cs :
- il manque "using System.IO;" pour l'emploi de l'objet "Path".
- la variable "ext" n'est pas mise à jour par l'emploi de l'objet "Path".
- il faut normalement employer l'API "DestroyIcon" pour supprimer l'handle extrait. Or le chargement effectué par l'appel à la fonction statique "Icon.FromHandle()" crée un lien persistant. On ne peut donc pas détruire l'handle.
Il faut donc créer une variable membre pour stocker le dernier handle extrait pour le supprimer à la destruction de l'objet "FileTypeInfo".

[DllImport("user32.dll")]
private extern static bool DestroyIcon(IntPtr hIcon);

private IntPtr                _hIcon = IntPtr.Zero;

~FileTypeInfo()
{
     if (_icon != null)
    {
        _icon.Dispose();
        _icon = null;
    }
    if (_hIcon != IntPtr.Zero) DestroyIcon(_hIcon);
}

...

avec _hIcon = ExtractIcon(hInst, file, icoNbr);

Dans cet exemple, le code est directement placé dans le destructeur.
Sinon, implémenter l'interface IDisposable. Placer le code dans la méthode Dispose() et appeler Dispose() dans le destructeur.

signaler à un administrateur
Commentaire de aogie le 10/05/2005 14:36:17

2ème possibilité.
Utiliser l'API SHGetFileInfo :
http://support.microsoft.com/?kbid=319350

signaler à un administrateur
Commentaire de BasicInstinct le 26/03/2007 12:19:50

y'a-t-il moyen de recuperer l'icone en 16*16 ?

signaler à un administrateur
Commentaire de doter le 12/08/2007 18:20:08

Salut tous le monde !
Pour recuperer les icones en 16*16 ,il faut utiliser " ExtractIconEx " qui permet de retourne les "large" et "small" icone .

signaler à un administrateur
Commentaire de bubbathemaster le 18/08/2007 00:57:38

Ca me met

"An unhandled exception of type 'System.ArgumentException' occurred in System.Drawing.dll

Additional information: Win32 handle that was passed to Icon is not valid or is the wrong type."

Pour moi ...

signaler à un administrateur
Commentaire de doter le 21/08/2007 21:31:04

Tu as essaye avec ExtractIcon et ca marchait.
Et quand tu remplace ExtractIcon par ExtractIconEx il tu sort ca comme probleme .
C'est ca ?

signaler à un administrateur
Commentaire de Thanatoster le 02/01/2008 23:21:53

Salut,
Très bonne source mais je pense que ce serait bien de rajouter un truk pour que la fonction FromExtension() renvoie une icône de base en cas d'extension inconnue (on sais jamais)

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Recuperer le nom d un fichier sans son extension dans un textbox [ par amirirn1 ] Bonjour,j aimerai recuperer le nom d un fichier que j ai ouvert dans un textbox sans l extension du fichier.aaa.txt je veux textbox.Text  = aaa association extension de fichier / application [ par Blacknight91 ] Bl@cknightBonjour,J'aimerais savoir comment associé une extension de fichier avec une application ? Et ainsi que l'extension soit reconnu de windows p Charger une image dans un picturebox [ par Fildomen ] sltje veux charger un fichier image dans un picture box, mais après le chargement, je veux avoir la possibilité de supprimer le fichier et l'image res tabulation dans un fichier ? [ par Thanos_the_yopper ] j'aurais voulu savoir comment ajouter une tabulation dans un fichier texte. Merci d'avance :)Final Fantasy Memories Venez découvrir les origines d'une crystal report [ par cautch ] Salut, voila je dois devellopper un prgm de gestion d un restaurant pour mes cours.ds mon prgm je dois visionner trois menu differents qui se trouve d Code pour fichier Excel 4.0 - Conversion fichier 4.0 [ par Mikels ] Hello,Tout d'abord, le contexte : je dois manipuler des fichiers crées par un appli vieille comme hérode qui ne m'exporte les fichiers de données que Recherche de Fichier [ par creanova2000 ] creanovaBonjour,J'aimerai bien savoir comment je peux effectuer une recherche de fichier sur mon disque dure.par example si je veux crerer un programm Lancer un fichier d'aide compilé [ par Maglitee ] Bonjour, j'ai réalisé une application en C#. J'ai dans mon menu un bouton "aide". J'ai également réalisé un fichier d'aide compilé (*.chm).J'aimerai a ini files avec C# [ par ellen ] Comment fait-on pour lire un fichier ini (ou de configuration) avec C#?Je souhaite avoir accès à des paramètres dans un fichier de configuration avec TopScore [ par ricklekebekoi ] Hello,Bah voila, je souhaite faire un topscore qui s'enregistre évidemment. Vient la question: quel support utiliser ? c'est évident que je ne veut pa


Nos sponsors

Sondage...

CalendriCode

Novembre 2008
LMMJVSD
     12
3456789
10111213141516
17181920212223
24252627282930

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,359 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.