2009-06-06 26 views
6

Estoy usando Boost pero no puedo encontrar documentación completa (o buena) sobre la biblioteca del sistema de archivos en el directorio de instalación ni en la web. El ejemplo "-l" que encontré ha sido bastante útil, pero no es suficiente.¿Cómo puedo saber el tipo de archivo usando Boost.Filesystem?

Gracias de antemano :)

+0

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

Respuesta

5

¿Qué tal:

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

Las funciones para averiguar el tipo de archivo (directorio, archivo normal, etc.) se encuentra en esta subpágina: http://www.boost.org/doc/libs/1_39_0/libs/filesystem/doc/reference.html#file_status

Si buscas la extensión del archivo check out: template <class Path> typename Path::string_type extension(const Path &p); en la página: http://www.boost.org/doc/libs/1_39_0/libs/filesystem/doc/reference.html#Convenience-functions

4

Aquí es un ejemplo de cómo se puede recuperar la extensión de los archivos:

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(); 

Este ejemplo sólo se necesita todos los archivos y las tiras de extensión de ellos y muestra en la salida estándar, podría modificar GetAllFileExtensions de función para que busque sólo en uno presentar

7

Aquí se muestra un ejemplo:

#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 salida es ".txt"

Recordatorio: compilar con '-lboost_system -lboost_filesystem'

0

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.

Cuestiones relacionadas