2009-06-06 4 views
6

J'utilise Boost mais je ne trouve pas de documentation complète (ou bonne) sur la bibliothèque du système de fichiers dans le répertoire d'installation ou sur le web. L'exemple "-ls" que j'ai trouvé a été très utile, mais ce n'est pas suffisant.Comment puis-je connaître le type d'un fichier utilisant Boost.Filesystem?

Merci à l'avance :)

+0

La documentation d'amplification est souvent incomplète. et cela vous donne l'impression qu'ils parlent des fonctions, pas ** comment les utiliser **. – qed

Répondre

5

Que diriez-vous:

http://www.boost.org/doc/libs/1_39_0/libs/filesystem/doc/index.htm

Les fonctions pour déterminer le type de fichier (répertoire, etc. fichier normal) se trouve sur cette sous-page: http://www.boost.org/doc/libs/1_39_0/libs/filesystem/doc/reference.html#file_status

Si vous cherchez l'extension de fichier à consulter: template <class Path> typename Path::string_type extension(const Path &p); sur la page: http://www.boost.org/doc/libs/1_39_0/libs/filesystem/doc/reference.html#Convenience-functions

4

Voici un exemple de la façon dont vous pouvez chercher l'extension à partir de fichiers:

std::vector<boost::filesystem::path> GetAllFileExtensions() 
{ 
    std::vector<boost::filesystem::path> fileExtensions; 
    boost::filesystem::directory_iterator b(boost::filesystem::current_path()), e; 
    for (auto i=b; i!=e; ++i) 
    { 
     boost::filesystem::path fe = i->path().extension(); 
     std::cout << fe.string() << std::endl; 
     fileExtensions.push_back(fe); 
    } 

    return fileExtensions; 
} 

std::vector<boost::filesystem::path> fileExtensions = GetAllFileExtensions(); 

Cet exemple ne prend que tous les fichiers et les bandes l'extension d'eux et montre sur la sortie standard, vous pouvez modifier GetAllFileExtensions fonction seulement regarder un fichier

7

est un exemple:

#include <iostream> 
#include <boost/filesystem.hpp> 
#include <string> 

using namespace std; 

int main() { 
    string filename = "hello.txt"; 

    string extension = boost::filesystem::extension(filename); 

    cout << "filename extension: " << extension << endl; 

    return 0;  
} 

La sortie est "txt"

Rappel: Compiler avec '-lboost_system -lboost_filesystem'

0

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.

Questions connexes