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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
iPet3o
1 / 1 / 0
Регистрация: 17.04.2013
Сообщений: 32
#1

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

20.08.2014, 14:36. Просмотров 438. Ответов 8
Метки нет (Все метки)

Здравствуйте, собственно вот что требуется: имея полный путь к файлу и его расширение узнать тип файла, например для .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", т.к. в реестре для этого расширения не прописан тип контента. Как можно обойти этот недостаток? Может какая-то библиотека для этого есть?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.08.2014, 14:36
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Узнать тип файла по его расширению (C++):

Как получить описание типа файла по его расширению - C++
Подскажите пожалуйста какие есть функции (например WINAPI) с помощью которых можно получить описание типа файла (т.е. описание которое дает...

Написать программу поиска файла на ПК по его расширению, и отправки его на e-mail - C++
Я ищу человека который мне поможет написать программу для поиска файла на ПК по его расширению, и отправка его на e-mail , лучше бы чтобы...

Узнать тип значения, зная тип указателя - C++
Здравствуйте! Есть такой код: template<class Iter> void func(Iter first, Iter last) { //... Iter_value_type = *first;...

clrscr(); не определен данный тип и const MAX_ELEMENTS = 4; отсутсвует тип int когда я его туда вписываю у меня больше ошибок вылазит - C++
#include "stdafx.h" #include <ctime> #include <stdio.h> #include <conio.h> int main() { const MAX_ELEMENTS = 4; ...

Чтение файла с данными типа real. Тип real в билдере или как его "обойти"? - C++
Читаю файл в структуру, double Fdat; struct STR { ... } rec

Узнать тип переменной - C++
1) Как узнать тип переменной? Что то типо такого возможно?: if ( getType(var) == "int") 2) Подскажите способы конвертирования...

8
quwy
Native x86
3275 / 2121 / 573
Регистрация: 13.02.2013
Сообщений: 7,059
20.08.2014, 14:42 #2
Цитата Сообщение от iPet3o Посмотреть сообщение
в регистре
В реестре. Регистры -- в процессоре.

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

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

Цитата Сообщение от iPet3o Посмотреть сообщение
Вебсайт с исходниками недоступен и судя по всему уже давно.
Это Linux, исходники его стандартных утилит валяются во всему интернету. Тем более, что официальный архив с исходниками вполне себе доступен.
0
ranebull
523 / 356 / 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
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
20.08.2014, 15:30 #6
Цитата Сообщение от iPet3o Посмотреть сообщение
Но он вполне закономерно работает только для типов зарегистрированных в системе
А тебе надо сверх того? По однотонной обложке книги с написанными на ней на неизвестном языке названием и аббревиатурой жанра жанр определить сможешь? Причём, читать бесполезно, так как выучить язык текста можно только после того, как определишь жанр и беря в руки новую книгу язык текста снова забываешь, пока не определишь жанр.

Добавлено через 3 минуты
Цитата Сообщение от quwy Посмотреть сообщение
В Linux есть консольная утилита file, которая решает эту задачу. Скачайте исходники и посмотрите.
Вот только она пытается анализировать сам файл и на экзотических форматах будет в лучшем случае выдавать "unknown type", а в худшем принимать экзотику за файлы распространённых типов.
0
iPet3o
1 / 1 / 0
Регистрация: 17.04.2013
Сообщений: 32
20.08.2014, 15:38  [ТС] #7
Цитата Сообщение от taras atavin Посмотреть сообщение
А тебе надо сверх того?
Нет, но как оказалось тот же avi или flac нужного ключа в реестре не имеют, и это не единичный случай. Не сидеть же мне и не вводить все это руками, а когда моя программа к кому-то другому на компьютер попадет что делать?
0
Alex5
1072 / 736 / 114
Регистрация: 12.04.2010
Сообщений: 1,882
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)

И если не нашли в реестре, искать в своём массиве.
Список форматов файлов.
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
20.08.2014, 15:51 #9
Цитата Сообщение от Alex5 Посмотреть сообщение
Можно создать в своей программе массив
И при установке её все эти типы регить в системе.
0
20.08.2014, 15:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.08.2014, 15:51
Привет! Вот еще темы с ответами:

template, узнать тип переменной - C++
template <class RCIN> RCIN cinn(void) { RCIN enter; if(RCIN == std::string) // Как узнать тип RCIN ?? getline(std::cin,...

Узнать тип для new в runtim'e - C++
можно ли создать динамически с помощью new(или как-то иначе) объект типа, такого же, как тип другого объекта(указателя)? причем тип этого...

Объясните пожалуйста, как узнать тип ОС - C++
В связи что нужно срочно разработать программу, то приходится дома писать в убунту, а на работе под виндой, как мне написать код так чтобы...

Узнать тип, на который указывает итератор - C++
Всем привет! Вот например у меня есть такой код: vector<double> objInt2; objInt2.push_back(1); objInt2.push_back(2); ...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru