Я не знаю, какую операционную систему вы используете, но в системах типа 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
), но достаточно близко.
Дополнительная документация часто неполна. и создается впечатление, что они говорят о функциях, а не о том, как их использовать **. – qed