Je ne sais pas quel système d'exploitation vous utilisez, mais sur les systèmes de type UN * X comme GNU/Linux, l'extension de fichier fait simplement partie du nom de fichier et ne fait toute déclaration sur le contenu du fichier. Habituellement, il est ignoré tous ensemble et seul le type MIME du fichier est examiné (ce qui est fait par les gestionnaires de fichiers comme Nautilus). En utilisant Boost vous ne pouvez pas (?) Obtenir le type MIME d'un fichier mais vous pouvez utiliser libmagic
(qui est également utilisé par l'utilitaire file
). C'est une bibliothèque C pure mais les fonctions et les types pourraient facilement être enveloppés dans certaines classes 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);
}
Sur mon système, le fichier test.png
existe et le programme imprime
test.png has type application/octet-stream
Certainement pas parfait (je me attendais image/png
), mais assez près.
La documentation d'amplification est souvent incomplète. et cela vous donne l'impression qu'ils parlent des fonctions, pas ** comment les utiliser **. – qed