如何实现 ls“filename_ [0-5] [3-4]?”喜欢上课?我希望将结果存储在向量。
中目前我正在使用 system(),它正在调用 ls ,但这在MS下无法移植。
感谢, 阿尔曼。
答案 0 :(得分:5)
以下程序列出当前目录中名称与正则表达式filename_[0-5][34]
匹配的文件:
#include <boost/filesystem.hpp>
#include <boost/regex.hpp> // also functional,iostream,iterator,string
namespace bfs = boost::filesystem;
struct match : public std::unary_function<bfs::directory_entry,bool> {
bool operator()(const bfs::directory_entry& d) const {
const std::string pat("filename_[0-5][34]");
std::string fn(d.filename());
return boost::regex_match(fn.begin(), fn.end(), boost::regex(pat));
}
};
int main(int argc, char* argv[])
{
transform_if(bfs::directory_iterator("."), bfs::directory_iterator(),
std::ostream_iterator<std::string>(std::cout, "\n"),
match(),
mem_fun_ref(&bfs::directory_entry::filename));
return 0;
}
为简洁起见,我省略了transform_if()
的定义。它不是一个标准函数,但应该很容易实现。
答案 1 :(得分:2)
您可以使用boost :: filesystem,它具有可移植的方式来检索目录中的文件。
然后你可以使用boost :: regex检查正则表达式的文件,例如只保留与你的模式匹配的文件。
答案 2 :(得分:0)
增强解决方案是可移植的,但在Windows上并不是最佳的。原因是它调用FindFirstFile("*.*")
并因此返回所有内容。鉴于全局模式,调用FindFirstFile("filename_?*.*")
会更有效。您仍然必须过滤结果(使用例如Boost :: regex),但这将排除许多不可能匹配的文件。
此外,使用任一方法都不要忘记在执行正则表达式匹配之前过滤掉目录。检查条目是否是目录非常便宜。