Я не знаю, какую операционную систему вы используете, но в системах типа UN * X, таких как GNU / Linux, расширение файла является лишь частью имени файла и делает какие-либо заявления о содержимом файла. Обычно все это игнорируется, и проверяется только MIME-тип файла (что делается файловыми менеджерами, такими как Nautilus).
Используя Boost, вы не можете (?) Получить MIME-тип файла, но вы можете использовать libmagic
(который также используется утилитой file
). Это чистая библиотека C, но функции и типы можно легко обернуть в некоторые классы RAII.
#include <iostream>
#include <string>
#include <cassert>
#include <magic.h>
int main()
{
std::string filename{"test.png"};
// allocate magic cookie
magic_t magic;
assert( (magic = magic_open(MAGIC_MIME_TYPE)) != nullptr );
// load the default magic database (indicated by nullptr)
assert( magic_load(magic, nullptr) == 0 );
// compile the default magic database (indicated by nullptr)
assert( magic_compile(magic, nullptr) == 0 );
// get description of the filename argument
char const * mime;
assert( (mime = magic_file(magic, filename.c_str())) != nullptr );
std::cout << filename << " has type " << mime << "\n";
// free magic cookie (BEWARE! this frees "mime")
magic_close(magic);
}
В моей системе существует файл test.png
, и программа печатает
test.png has type application/octet-stream
Конечно, не идеально (я ожидал image/png
), но достаточно близко.