Существует MimeMapping.GetMimeMapping(string filename)
Напротив MimeMapping.GetMimeMapping?
Существует ли .Net-функция, которая делает «противоположную». Это берет строку mime и возвращает расширение типа файла?
Существует MimeMapping.GetMimeMapping(string filename)
Напротив MimeMapping.GetMimeMapping?
Существует ли .Net-функция, которая делает «противоположную». Это берет строку mime и возвращает расширение типа файла?
Вы можете прочитать реестр, чтобы получить эту информацию.
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"]));
Имея только работать в этом себя и быть несчастным с наличием несоответствия между 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;
}
я решил не бросать исключения в случае неудачи отражения, и просто не возвращают расширения, потому что это соответствует моей личной пользы дела.
Когда я использую это для «image/jpeg» в своей системе, он возвращает .jfif, .jpeg и .jpg. Любая идея, как может различать, что .jpg будет моим предпочтительным расширением? Я заглянул в реестр и не нашел ничего, что мог бы использовать ... – Jeff