【发布时间】:2016-03-19 12:45:35
【问题描述】:
!!!解决了!!!
感谢大家的帮助,现在一切正常。我按照@RSahu 的建议对我的代码进行了更改并让它工作。
感谢您的所有意见,我真的很困惑。
致@Basile:我肯定会检查一下,但是对于这段特殊的代码,我不会使用它,因为它看起来太复杂了:) 但是感谢您的建议。
原问题
我正在尝试制作一个 C++ 代码来列出给定目录及其子目录中的所有文件。
快速解释
想法是函数list_dirs(_dir, _files, _current_dir)将从顶层目录开始并将文件放入向量_files,当它找到一个目录时,它将在这个目录上调用自己。如果在子目录中,_current_dir 将被添加到文件名之前,因为我需要知道路径结构(它应该生成 sitemap.xml)。
在list_dirs 中有一个对list_dir 的调用,它只返回当前目录中的所有文件,文件和目录之间没有区别。
我的问题
现在代码的作用是列出原始目录中的所有文件,然后列出一个子目录中的所有文件,但跳过所有其他子目录。它会列出它们,但不会列出其中的文件。
更神秘的是,它只列出这个特定目录中的文件,而不是其他目录。我尝试在多个位置运行它,但它从未进入任何其他目录。
提前致谢,请注意我是 C++ 的初学者,所以不要苛刻 ;)
LIST_DIR
int list_dir(const std::string& dir, std::vector<std::string>& files){
DIR *dp;
struct dirent *dirp;
unsigned fileCount = 0;
if ((dp = opendir(dir.c_str())) == NULL){
std::cout << "Error opening dir." << std::endl;
}
while ((dirp = readdir(dp)) != NULL){
files.push_back(std::string (dirp->d_name));
fileCount++;
}
closedir(dp);
return fileCount;
}
和 LIST_DIRS
int list_dirs (const std::string& _dir, std::vector<std::string>& _files, std::string _current_dir){
std::vector<std::string> __files_or_dirs;
list_dir(_dir, __files_or_dirs);
std::vector<std::string>::iterator it = __files_or_dirs.begin();
struct stat sb;
while (it != __files_or_dirs.end()){
if (lstat((&*it)->c_str(), &sb) == 0 && S_ISDIR(sb.st_mode)){
/* how to do this better? */
if (*it == "." || *it == ".."){
__files_or_dirs.erase(it);
continue;
}
/* here it should go into sub-directory */
list_dirs(_dir + *it, _files, _current_dir + *it);
__files_or_dirs.erase(it);
} else {
if (_current_dir.empty()){
_files.push_back(*it);
} else {
_files.push_back(_current_dir + "/" + *it);
}
++it;
}
}
}
【问题讨论】:
标签: c++ linux list file directory