Как я могу узнать тип файла, используя Boost.Filesystem? - PullRequest
9 голосов
/ 06 июня 2009

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

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

Ответы [ 5 ]

12 голосов
/ 14 сентября 2016

Вот пример:

#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'

5 голосов
/ 06 июня 2009

Как насчет:

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 голосов
/ 07 марта 2014

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

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, чтобы просматривать только один файл

0 голосов
/ 22 февраля 2018

Этот небольшой фрагмент кода обнаружил mimetype без магической зависимости lib / Qt: https://github.com/drodil/cpp-util/blob/master/file/mime/detector.hpp

Может быть, вы можете использовать это снова.

0 голосов
/ 02 июля 2017

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...