我正在使用Boost,但我找不到有关安装目录和Web中的文件系统库的完整(或良好)文档。我发现的“-ls”例子是一个很好的帮助,但这还不够。
提前致谢:)
答案 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类型,但可以使用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
)但足够接近。
答案 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;