我使用了以下代码。
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>
答案 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) //处理它