Как по содержимому файла определить его тип
От: SergioR Российская Империя  
Дата: 12.01.07 11:38
Оценка: :)))
Нужен аналог функции

String GetFileExtension(String FileNameWithoutExtension);


Есть файл без расширения. Надо определить чем его открывать, можно даже не знать его конкретного расширения. Здесь не обойтись без того, что придется из него прочитать несколько байт (заголовок).
Но самому просматривать некоторые наиболее известные типы (документ ворд, xml, архив...) — не дело.
Re: Как по содержимому файла определить его тип
От: _FRED_ Черногория
Дата: 12.01.07 12:05
Оценка: +2
Здравствуйте, SergioR, Вы писали:

SR>Есть файл без расширения. Надо определить чем его открывать, можно даже не знать его конкретного расширения. Здесь не обойтись без того, что придется из него прочитать несколько байт (заголовок).

SR>Но самому просматривать некоторые наиболее известные типы (документ ворд, xml, архив...) — не дело.

В общем случае эта задача не-решаемая. Для ограниченного количества типов файлов (расширений) можно попытаться что-либо придумать.
... << RSDN@Home 1.2.0 alpha rev. 670>>
Now playing: «Тихо в лесу…»
Help will always be given at Hogwarts to those who ask for it.
Re: Как по содержимому файла определить его тип
От: Sinclair Россия https://github.com/evilguest/
Дата: 15.01.07 08:54
Оценка: 13 (2)
Здравствуйте, SergioR, Вы писали:

SR>Нужен аналог функции


SR>
SR>String GetFileExtension(String FileNameWithoutExtension);
SR>


SR>Есть файл без расширения. Надо определить чем его открывать, можно даже не знать его конкретного расширения. Здесь не обойтись без того, что придется из него прочитать несколько байт (заголовок).

Мат в три хода:
1. Получаем MIME-тип:
        /// <summary>
        /// Enumerates the flags for the FindMimeFromData function
        /// </summary>
        [Flags]
        public enum MimeFlags
        {
            /// <summary>
            /// No flags specified
            /// </summary>
            None = 0
        };

        [DllImport("urlmon.dll", CharSet = CharSet.Auto)]
        private static extern int FindMimeFromData(IntPtr pBC, string url, byte[] buffer, int bufferSize,
            string pwzMimeProposed, MimeFlags mimeFlags, out string ppwzMimeOut, int dwReserved);
        /// <summary>
        /// Determines the Multipurpose Internet Mail Extensions (MIME) type from the data provided.
        /// </summary>
        /// <param name="url">String value that contains the URL of the data. This can be set to null if buffer contains the data to be sniffed.</param>
        /// <param name="buffer">Buffer containing the data to be sniffed. This can be set to null if url contains a valid URL.</param>
        /// <param name="mimeProposed">String value containing the proposed MIME type. This can be set to null.</param>
        /// <returns>String value containing the suggested MIME type</returns>
        public static string FindMimeFromData(string url, byte[] buffer, string mimeProposed)
        {
            const int maxLen = 255;
            string result;
            int hr;
            int bufLen = 0;
            if (buffer != null)
                bufLen = buffer.Length < maxLen ? buffer.Length : maxLen;
            hr = FindMimeFromData(new IntPtr(0), url, buffer, bufLen, mimeProposed, MimeFlags.None, out result, 0);
            return result;
        }

2. Ищем "родное" расширение в реестре по пути HKLM\Software\Classes\MIME\Database\<тип>:Extension
3. Определяем, кто будет его обрабатывать через вызов AssocQueryString:
        uint pcchOut = 0;
    AssocQueryString(AssocF.Open_ByExeName, AssocStr.Executable, doctype, null, null, ref pcchOut);
    StringBuilder pszOut = new StringBuilder((int)pcchOut);
    AssocQueryString(AssocF.Open_ByExeName, AssocStr.Executable, doctype, null, pszOut, ref pcchOut);
1.2.0 alpha rev. 655
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Как по содержимому файла определить его тип
От: Аноним  
Дата: 12.01.07 11:49
Оценка:
В юниксах есть такая замечательная утилитка file, которая как раз этим занимается. Можно посмотреть алгоритм ее работы или напрямую воспользоваться.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.