C ++模仿命令

时间:2010-05-11 08:06:03

标签: c++ stl boost system

如何实现 ls“filename_ [0-5] [3-4]?”喜欢上课?我希望将结果存储在向量

目前我正在使用 system(),它正在调用 ls ,但这在MS下无法移植。

感谢, 阿尔曼。

3 个答案:

答案 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),但这将排除许多不可能匹配的文件。

此外,使用任一方法都不要忘记在执行正则表达式匹配之前过滤掉目录。检查条目是否是目录非常便宜。