No sé qué sistema operativo usa, pero en los sistemas de tipo UN * X como GNU/Linux, la extensión de archivo es simplemente parte del nombre de archivo y hace cualquier declaración sobre el contenido del archivo. Por lo general, se ignora todo junto y solo se examina el tipo MIME del archivo (lo cual es hecho por administradores de archivos como Nautilus).
Usando Boost no puede (?) Obtener el tipo MIME de un archivo pero puede usar libmagic
(que también es usado por la utilidad file
). Es una biblioteca de C pura, pero las funciones y los tipos podrían incluirse fácilmente en algunas clases de 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);
}
En mi sistema el archivo test.png
existe y que el programa imprime
test.png has type application/octet-stream
Ciertamente no es perfecto (I espera image/png
) pero lo suficientemente cerca.
la documentación de refuerzo a menudo está incompleta. y le da la impresión de que están hablando de las funciones, no ** de cómo usarlas **. – qed