我正在尝试列出文件夹中某种类型的所有文件,以便我可以遍历它们。这应该很简单,当然,但我无法得到它。 我找到了一些使用dirent.h的例子,但是我需要用直接的c ++来做这个。
最好的方法是什么?
感谢。
答案 0 :(得分:6)
你不能在“直接C ++”中执行此操作,因为C ++没有文件系统API yet。
我传统上建议使用Boost.Filesystem,但据称你想“避免使用第三方标题,如果[你]可以”。
所以你最好的选择是使用POSIX dirent.h ,就像你一直在做的那样。它就像你将要获得的“非第三方”一样。
答案 1 :(得分:-1)
这样的东西?这会找到您指定的文件夹中的所有suid文件,但可以修改以查找任意数量的内容,或者如果这是“类型”的含义,则使用正则表达式作为扩展名。
#include <sys/stat.h>
#include <sys/types.h>
#include <iostream>
#include <string>
#include <sstream>
#include <dirent.h>
#include <vector>
bool is_suid(const char *file)
{
struct stat results;
stat(file, &results);
if (results.st_mode & S_ISUID) return true;
return false;
}
void help_me(char *me) {
std::cout
<< "Usage:" << std::endl
<< " " << me << " /bin/ /usr/sbin/ /usr/bin/ /usr/bin/libexec/" << std::endl;
exit(1);
}
int main(int argc, char **argv)
{
if (argc < 2) help_me(argv[0]);
std::string file_str;
std::vector<std::string> file_list;
for (int path_num = 1; path_num != argc; path_num++) {
const char * path = argv[path_num];
DIR *the_dir;
struct dirent *this_dir;
the_dir = opendir(path);
if (the_dir != NULL) while (this_dir = readdir(the_dir)) file_list.push_back(std::string(this_dir->d_name));
std::string name;
for(int file_num = 0; file_num != file_list.size(); file_num++) {
name = file_list[file_num];
std::string path_to_file = std::string(path) + file_list[file_num];
if (is_suid(path_to_file.c_str()) == true) std::cout << path_to_file << std::endl;
}
file_list.clear();
file_list.shrink_to_fit();
}
exit(0);
}