2014-01-24 1 views
1

Существует MimeMapping.GetMimeMapping(string filename)Напротив MimeMapping.GetMimeMapping?

Существует ли .Net-функция, которая делает «противоположную». Это берет строку mime и возвращает расширение типа файла?

ответ

3

Вы можете прочитать реестр, чтобы получить эту информацию.

var mapping = Microsoft.Win32.Registry.ClassesRoot.GetSubKeyNames() 
       .Select(key => new 
       { 
        Key = key, 
        ContentType = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(key).GetValue("Content Type") 
       }) 
       .Where(x => x.ContentType != null) 
       .ToLookup(x => x.ContentType, x => x.Key); 

Console.WriteLine(String.Join(";",mapping["image/jpeg"])); 
+0

Когда я использую это для «image/jpeg» в своей системе, он возвращает .jfif, .jpeg и .jpg. Любая идея, как может различать, что .jpg будет моим предпочтительным расширением? Я заглянул в реестр и не нашел ничего, что мог бы использовать ... – Jeff

0

Имея только работать в этом себя и быть несчастным с наличием несоответствия между GetMimeMapping и реверсом (посредством предоставления альтернативного списка на то, что MimeMapping использует), я порылся в самой MimeMapping, чтобы получить свои внутренние отображения.

public static IEnumerable<string> GetExtensions(this string mimeType) 
{ 
    var mappingDictionaryField = typeof(MimeMapping).GetField("_mappingDictionary", BindingFlags.NonPublic | BindingFlags.Static); 

    if (mappingDictionaryField == null) 
     return new string[0]; 

    // get the internal dictionary used for mime type lookup 
    var mappingDictionary = mappingDictionaryField.GetValue(null); 

    if (mappingDictionary == null) 
     return new string[0]; 

    // get type that owns the populate method and populated dictionary 
    var dictionaryType = mappingDictionary.GetType().BaseType; 

    if (dictionaryType == null) 
     return new string[0]; 

    var populateMethod = dictionaryType.GetMethod("PopulateMappings", BindingFlags.NonPublic | BindingFlags.Instance); 

    if (populateMethod == null) 
     return new string[0]; 

    populateMethod.Invoke(mappingDictionary, null); 

    // get the populated mapping dictionary 
    var mappingField = dictionaryType.GetField("_mappings", BindingFlags.Instance | BindingFlags.NonPublic); 

    if (mappingField == null) 
     return new string[0]; 

    var mapping = mappingField.GetValue(mappingDictionary) as IDictionary<string, string>; 

    if (mapping == null) 
     return new string[0]; 

    var extensions = mapping.Where(x => x.Value == mimeType) 
          .Select(x => x.Key); 

    return extensions; 
} 

я решил не бросать исключения в случае неудачи отражения, и просто не возвращают расширения, потому что это соответствует моей личной пользы дела.