Как я могу определить тип содержимого файла в .NET?
-
22-08-2019 - |
Вопрос
Мне задано имя файла, и я должен иметь возможность прочитать его с диска и отправить его содержимое по сети.Мне нужно иметь возможность определить, является ли файл текстовым или двоичным, чтобы я знал, использовать ли StreamReader или BinaryReader.Еще одна причина, по которой мне нужно знать тип контента, заключается в том, что если он двоичный, я должен MIME-кодировать данные перед отправкой их по проводу.Я также хотел бы иметь возможность сообщить потребителю, каков тип контента (включая кодировку, если это текст).
Спасибо!
Решение
В расширение имени файла предоставляет вам наилучшую подсказку о типе содержимого файла.
Это не идеально, но я с некоторым успехом использовал следующее:
private static string GetContentTypeFromRegistry(string file)
{
RegistryKey contentTypeKey = Registry.ClassesRoot.OpenSubKey(@"MIME\Database\Content Type");
foreach (string keyName in contentTypeKey.GetSubKeyNames())
{
if (System.IO.Path.GetExtension(file).ToLower().CompareTo((string)contentTypeKey.OpenSubKey(keyName).GetValue("Extension")) == 0)
{
return keyName;
}
}
return "unknown";
}
private static string GetFileExtensionFromRegistry(string contentType)
{
RegistryKey contentTypeKey = Registry.ClassesRoot.OpenSubKey(@"MIME\Database\Content Type\" + contentType);
if (contentTypeKey != null)
{
string extension = (string)contentTypeKey.GetValue("Extension");
if (extension != null)
{
return extension;
}
}
return String.Empty;
}
Другие советы
Вам либо нужно заранее знать тип файла, либо вам скажут, какого типа этот файл.И почему бы вам просто не использовать Stream.Методы Write и Stream.Read, если все, что вы делаете, это отправляете файл по сети?Позвольте потребителю сервиса определить тип файла.Вам не нужно использовать классы * Reader, поскольку вы не интерпретируете данные на своем сервере.
Вы можете попробовать эту бесплатную библиотеку детекторов mime.http://www.netomatix.com/Products/DocumentManagement/MimeDetector.aspx