C++:如何检查不带扩展名的文件类型

Pad*_*dre 1 c++ linux boost

我用来boost::filesystem搜索和处理目录中的文件。boost::filesystem::is_regular_file()但我只想处理文本文件(或至少忽略二进制文件),而不是处理每个文件(通过使用检查)。

即使文件没有扩展名,有没有办法可以实现这一点?

我非常感谢独立于平台的解决方案。

seh*_*ehe 5

使用libmagic

Libmagic 可在所有主要平台(以及许多次要平台)上使用。

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

using namespace boost;
namespace fs = filesystem;

int main() {
    auto handle = ::magic_open(MAGIC_NONE|MAGIC_COMPRESS);
    ::magic_load(handle, NULL);

    for (fs::directory_entry const& x : make_iterator_range(fs::directory_iterator("."), {})) {
        auto type = ::magic_file(handle, x.path().native().c_str());
        std::cout << x.path() << "\t" << (type? type : "UNKOWN") << "\n";
    }

    ::magic_close(handle);
}
Run Code Online (Sandbox Code Playgroud)

打印,例如

sehe@desktop:~/custom/boost/status$ /tmp/test 
"./Jamfile.v2"  ASCII text
"./explicit-failures.xsd"   XML document text
"./expected_results.xml"    XML document text
"./explicit-failures-markup.xml"    XML document text
Run Code Online (Sandbox Code Playgroud)

您可以使用标志来控制分类的细节,例如MAGIC_MIME:

sehe@desktop:~/custom/boost/status$ /tmp/test 
"./Jamfile.v2"  text/plain; charset=us-ascii
"./explicit-failures.xsd"   application/xml; charset=us-ascii
"./expected_results.xml"    application/xml; charset=us-ascii
"./explicit-failures-markup.xml"    application/xml; charset=utf-8
Run Code Online (Sandbox Code Playgroud)

或者只是加载/etc/magic

sehe@desktop:~/custom/boost/status$ /tmp/test 
"./Jamfile.v2"  ASCII text
"./explicit-failures.xsd"   ASCII text
"./expected_results.xml"    ASCII text, with very long lines
"./explicit-failures-markup.xml"    UTF-8 Unicode text
Run Code Online (Sandbox Code Playgroud)