如何使用Boost.Filesystem知道文件的类型?

时间:2009-06-06 14:46:41

标签: c++ boost

我正在使用Boost,但我找不到有关安装目录和Web中的文件系统库的完整(或良好)文档。我发现的“-ls”例子是一个很好的帮助,但这还不够。

提前致谢:)

6 个答案:

答案 0 :(得分:12)

以下是一个例子:

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

输出为&#34; .txt&#34;

提醒:使用&#39; -lboost_system -lboost_filesystem编译&#39;

答案 1 :(得分: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

答案 2 :(得分: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只查看一个文件

答案 3 :(得分:0)

我不知道你使用的是哪种操作系统,但是在像GNU / Linux这样的UN * X类型系统上,文件扩展名只是文件名的一部分,并且对文件内容做了任何声明。通常它一起被忽略,只检查文件的MIME类型(由Nautilus等文件管理器完成)。

使用Boost,您不能(?)获取文件的MIME类型,但可以使用libmagicfile实用程序也使用它)。它是一个纯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)但足够接近。

答案 4 :(得分:0)

这个小代码片段是否检测到没有魔法lib / Qt依赖的mimetype: https://github.com/drodil/cpp-util/blob/master/file/mime/detector.hpp

也许你可以重复使用它。

答案 5 :(得分:0)

您可以使用libmagic,类似于上一个答案,但是您不需要 编译。 libmagic可以检测几乎所有文件类型:

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

using namespace std;
namespace bfs = boost::filesystem;

class MagicFile {
  magic_t mag;

public:
  MagicFile() {
    mag = magic_open(MAGIC_MIME_TYPE);
    if (mag == nullptr)
      throw runtime_error("Magic error");
    magic_load(mag, NULL);
  }

  ~MagicFile() {
    magic_close(mag);
  }

  string mime(bfs::path p) {
    return magic_file(mag, p.c_str());
  }
};

使用代码:

cout << "mime type: " << MagicFile().mime("myfile.dat") << endl;

或者:

MagicFile magic;
cout << "mime type: " << magic.mime("myfile.dat") << endl;