Форум программистов, компьютерный форум CyberForum.ru

Узнать тип файла по его расширению - C++

Восстановить пароль Регистрация
 
iPet3o
0 / 0 / 0
Регистрация: 17.04.2013
Сообщений: 31
20.08.2014, 14:36     Узнать тип файла по его расширению #1
Здравствуйте, собственно вот что требуется: имея полный путь к файлу и его расширение узнать тип файла, например для .mp3/.flac/.m4a и подобных нужно чтобы мы получали в ответ что это аудио файл, а для .txt/.doc - текстовый, ну и все в том же духе. Пробовал использовать вот такой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
string DBAdapter::GetMimeType(const string &szExtension)
{
    // return mime type for extension
    HKEY hKey = NULL;
    string szResult = "application/unknown";
 
    // open registry key
    if (RegOpenKeyEx(HKEY_CLASSES_ROOT, szExtension.c_str(),
        0, KEY_READ, &hKey) == ERROR_SUCCESS)
    {
        // define buffer
        char szBuffer[256] = { 0 };
        DWORD dwBuffSize = sizeof(szBuffer);
 
        // get content type
        if (RegQueryValueEx(hKey, "Content Type", NULL, NULL,
            (LPBYTE)szBuffer, &dwBuffSize) == ERROR_SUCCESS)
        {
            // success
            szResult = szBuffer;
        }
 
        // close key
        RegCloseKey(hKey);
    }
 
    // return result
    return szResult;
}
Но он вполне закономерно работает только для типов зарегистрированных в системе т.к смотрит на ключ "Content Type" в регистре, и если для, например, .mp3 он выводит что это "audio/mpeg", то для .avi я получаю "application/unknown", т.к. в реестре для этого расширения не прописан тип контента. Как можно обойти этот недостаток? Может какая-то библиотека для этого есть?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
quwy
Native x86
 Аватар для quwy
2735 / 1824 / 477
Регистрация: 13.02.2013
Сообщений: 6,113
20.08.2014, 14:42     Узнать тип файла по его расширению #2
Цитата Сообщение от iPet3o Посмотреть сообщение
в регистре
В реестре. Регистры -- в процессоре.

Цитата Сообщение от iPet3o Посмотреть сообщение
Как можно обойти этот недостаток?
Сверять данные из вашего файла с базой известных сигнатур.

Цитата Сообщение от iPet3o Посмотреть сообщение
Может какая-то библиотека для этого есть?
В Linux есть консольная утилита file, которая решает эту задачу. Скачайте исходники и посмотрите.
iPet3o
0 / 0 / 0
Регистрация: 17.04.2013
Сообщений: 31
20.08.2014, 14:47  [ТС]     Узнать тип файла по его расширению #3
Цитата Сообщение от quwy Посмотреть сообщение
Сверять данные из вашего файла с базой известных сигнатур.
Может подскажете способ и где взять эту базу?
Цитата Сообщение от quwy Посмотреть сообщение
В Linux есть консольная утилита file, которая решает эту задачу. Скачайте исходники и посмотрите.
Вебсайт с исходниками недоступен и судя по всему уже давно.
quwy
Native x86
 Аватар для quwy
2735 / 1824 / 477
Регистрация: 13.02.2013
Сообщений: 6,113
20.08.2014, 15:03     Узнать тип файла по его расширению #4
Цитата Сообщение от iPet3o Посмотреть сообщение
Может подскажете способ и где взять эту базу?
Ищите по запросу "known file signatures". Немного есть даже на википедии.

Цитата Сообщение от iPet3o Посмотреть сообщение
Вебсайт с исходниками недоступен и судя по всему уже давно.
Это Linux, исходники его стандартных утилит валяются во всему интернету. Тем более, что официальный архив с исходниками вполне себе доступен.
ranebull
 Аватар для ranebull
512 / 345 / 54
Регистрация: 23.06.2013
Сообщений: 1,182
Записей в блоге: 6
20.08.2014, 15:05     Узнать тип файла по его расширению #5
Цитата Сообщение от iPet3o Посмотреть сообщение
Вебсайт с исходниками недоступен и судя по всему уже давно.
ftp://ftp.astron.com/pub/file/
https://github.com/file/file
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
20.08.2014, 15:30     Узнать тип файла по его расширению #6
Цитата Сообщение от iPet3o Посмотреть сообщение
Но он вполне закономерно работает только для типов зарегистрированных в системе
А тебе надо сверх того? По однотонной обложке книги с написанными на ней на неизвестном языке названием и аббревиатурой жанра жанр определить сможешь? Причём, читать бесполезно, так как выучить язык текста можно только после того, как определишь жанр и беря в руки новую книгу язык текста снова забываешь, пока не определишь жанр.

Добавлено через 3 минуты
Цитата Сообщение от quwy Посмотреть сообщение
В Linux есть консольная утилита file, которая решает эту задачу. Скачайте исходники и посмотрите.
Вот только она пытается анализировать сам файл и на экзотических форматах будет в лучшем случае выдавать "unknown type", а в худшем принимать экзотику за файлы распространённых типов.
iPet3o
0 / 0 / 0
Регистрация: 17.04.2013
Сообщений: 31
20.08.2014, 15:38  [ТС]     Узнать тип файла по его расширению #7
Цитата Сообщение от taras atavin Посмотреть сообщение
А тебе надо сверх того?
Нет, но как оказалось тот же avi или flac нужного ключа в реестре не имеют, и это не единичный случай. Не сидеть же мне и не вводить все это руками, а когда моя программа к кому-то другому на компьютер попадет что делать?
Alex5
883 / 618 / 81
Регистрация: 12.04.2010
Сообщений: 1,552
20.08.2014, 15:41     Узнать тип файла по его расширению #8
Цитата Сообщение от iPet3o Посмотреть сообщение
в реестре для этого расширения не прописан тип контента. Как можно обойти этот недостаток?
Можно создать в своей программе массив

BMP (Windows or OS/2 bitmap)
GIF (Graphics Interchange Format)
AVI (Audio Video Interleave)
FLV (Flash Video)
HTML — (.html, .htm) — язык разметки гипертекста (HyperText Markup Language)
XML — (.xml) — расширяемый язык разметки (eXtensible Markup Language)

И если не нашли в реестре, искать в своём массиве.
Список форматов файлов.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.08.2014, 15:51     Узнать тип файла по его расширению
Еще ссылки по теме:

Узнать тип значения, зная тип указателя C++
Узнать тип объекта передаваемого по ссылке C++
Узнать тип для new в runtim'e C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
20.08.2014, 15:51     Узнать тип файла по его расширению #9
Цитата Сообщение от Alex5 Посмотреть сообщение
Можно создать в своей программе массив
И при установке её все эти типы регить в системе.
Yandex
Объявления
20.08.2014, 15:51     Узнать тип файла по его расширению
Ответ Создать тему
Опции темы

Текущее время: 23:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru