在 Linux 中使用 C++ 列出目录的所有文件不起作用

Listing all files of a directory using C++ in Linux is not working

本文关键字:不起作用 文件 Linux C++      更新时间:2023-10-16

我使用了以下代码。

dp = opendir( dir.c_str() );
while ((dirp = readdir( dp )))
{
    filepath = dir + "/" + dirp->d_name;
}

dirp->d_name值如下。

.\000\000\000\004\324E\020\000\000\000\

000\000\324!+^S\361Tf

\030\000\004..\000\000\004\237X\00\000\000\000\000fJ\035\224\321M\264l(\000\bFontTest1.pdf\000\000\000\000\000\000\b\236X\00\000\000\000\000\377\377\377\377\377\377\377\377(\000\bproject_report.pdf\000\000\b
您是否错误

地处理了"."和".."目录? (每个目录都有它们)

我用以下方法排除了它们:

std::string fn(ent->dname);
if(fn ==  ".") { if(dbg2) { std::cout << "S_DOT" << std::endl; } continue;}
if(fn == "..") { if(dbg2) { std::cout << "D_DOT" << std::endl; } continue;}

。在处理各种d_types之前

switch(ent->d_type)
{
case DT_UNKNOWN: {...}
case DT_DIR:     {...}
// ... etc
}

"继续"跳到循环处理 dirent 条目的开头。

最好的跨平台方法是如果你有filesystem库。不幸的是,这现在仍然是一个技术规范,所以你需要使用这个库的Boost版本,或者:experimental/filesystem

一旦你有了filesystem,你可以简单地使用一个directory_iterator

copy(directory_iterator(dir), directory_iterator(), ostream_iterator<path>(cout, "n"))

这个例子可能有点复杂。如果我能为您澄清一些事情,请告诉我。

在 Visual Studio 2015 中,如果您只需#include <filesystem>并执行using namespace tr2::sys,则此代码将运行。不幸的是,gcc 5.3 还没有实现directory_iterator.operator++(),所以你需要在那里 Boost,否则你会得到一个错误,如下:

std::experimental::filesystem::v1::__cxx11::directory_iterator::operator++()的未定义引用

谢谢大家。我能够通过添加以下代码对其进行排序。 无符号字符是文件 =0x8; if ( dirp->d_type == isFile) 处理它