2009-06-06 4 views
6

Я использую Boost, но я не могу найти полную (или хорошую) документацию о библиотеке файловой системы в каталоге установки или в Интернете. Пример «-ls», который я нашел, был довольно полезным, но этого недостаточно.Как узнать тип файла с помощью Boost.Filesystem?

Заранее спасибо :)

+0

Дополнительная документация часто неполна. и создается впечатление, что они говорят о функциях, а не о том, как их использовать **. – qed

ответ

5

Как насчет:

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

Функции для выяснить тип файла (каталог, обычный файл и т.д.) находится на этом субстранице: http://www.boost.org/doc/libs/1_39_0/libs/filesystem/doc/reference.html#file_status

Если вы ищете расширение файла, зарегистрируйтесь: template <class Path> typename Path::string_type extension(const Path &p); на странице: http://www.boost.org/doc/libs/1_39_0/libs/filesystem/doc/reference.html#Convenience-functions

4

Вот пример того, как вы можете получить расширение из файлов:

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

Этот пример просто принимает все файлы и полосы расширения от них и показывает на стандартный вывод, можно изменить функцию GetAllFileExtensions, чтобы смотреть только на одном файл

7

Вот пример:

#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;  
} 

выход ".txt"

Напоминание: скомпилировать с '-lboost_system -lboost_filesystem'

0

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

Смежные вопросы