在Linux中使用C ++列出目录的所有文件是行不通的

时间:2016-04-28 11:25:01

标签: c++ ubuntu-14.04

我使用了以下代码。

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!+ 2 -S \ 361Tf \ 030 \ 000 \ 004 .. \ 000 \ 000 \ 004 \ 237X \ n \ 000 \ 000 \ 000 \ 000 \ 000fJ \ 035 \ 224 \ 321M \264升(\ 000 \ bFontTest1.pdf \ 000 \ 000 \ 000 \ 000 \ 000 \ 000 \ 000 \ b \ 236X \ n \ 000 \ 000 \ 000 \ 000 \ 000 \ 377 \ 377 \ 377 \ 377 \ 377 \ 377 \ 377 \ 177(\ 000 \ bproject_report.pdf \ 000 \ 000 \ b'/ p>

3 个答案:

答案 0 :(得分:2)

你是否可能误操作"。"和" .."迪尔斯? (每个目录都有)

我将它们排除在外:

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
}

&#34;继续&#34;跳到循环处理dirent条目的开头。

答案 1 :(得分:1)

执行此操作的最佳跨平台方法是,如果您拥有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++()

的未定义引用

答案 2 :(得分:0)

谢谢大家。我可以通过添加以下代码来解决它。     unsigned char isFile = 0x8;     if(dirp-&gt; d_type == isFile)         //处理它