using Microsoft.Win32;
using System.IO;
/// <summary>
/// Récupère le type MIME d'un fichier
/// </summary>
/// <param name="szFileName">Nom du fichier dont on veut le type MIME</param>
/// <param name="forceDatabase">true pour rechercher
/// dans HKEY_CLASSES_ROOT\MIME\DataBase\Content Type (MIME -> extension),
/// false pour rechercher
/// dans HKEY_CLASSES_ROOT (extension -> MIME)</param>
/// <returns>le type MIME ou null</returns>
public static string GetMIMEType(string szFileName,bool forceDatabase)
{
//type MIME renvoyé
string ret = null;
//extension du fichier avec "."
string szExt = Path.GetExtension(szFileName);
//valeur d'une valeur d'une clé de registre
object val = null;
//si on veut lire dans HKEY_CLASSES_ROOT directement
if (!forceDatabase)
{
//on essaie d'ouvrir la clé
RegistryKey extKey = Registry.ClassesRoot.OpenSubKey(szExt);
if (extKey != null)
{
//il peut y avoir une valeur "Content Type" contenant le type MIME mais ce n'est pas obligatoire
val = extKey.GetValue("Content Type");
extKey.Close();
}
}
//si on a déjà trouvé un type MIME et que l'on ne force pas la recherche dans HKEY_CLASSES_ROOT\MIME\DataBase\Content Type
if (!forceDatabase && val != null)
return val.ToString();
else
{
//ouvre HKEY_CLASSES_ROOT\MIME\DataBase\Content Type
RegistryKey contentTypeKey = Registry.ClassesRoot.OpenSubKey(@"MIME\Database\Content Type");
//parcourt toutes les sous clés (types MIME connus)
foreach (string subkey in contentTypeKey.GetSubKeyNames())
{
//ouvre HKEY_CLASSES_ROOT\MIME\DataBase\Content Type\<type MIME>
RegistryKey contentTypeSubKey = contentTypeKey.OpenSubKey(subkey);
//récupère l'extension associée
object ext = contentTypeSubKey.GetValue("Extension");
//si ca correspond on a trouvé
if (ext != null && ext.ToString() == szExt)
{
ret = subkey;
break;
}
contentTypeSubKey.Close();
}
contentTypeKey.Close();
}
return ret;
}