从以特定单词开头的目录中提取所有文件

extract all files from a directory that start with a specific word

我有一个文件夹,其中包含名称为 "In_YMD_xxx" 和 "Out_YMD_xxx" 的文件,其中 YMD 是年月日(exp. 20150101),xxx 是其 IDX,例如 050。我正在寻找一种简单的方法来读取使用 C++ 中的 boost 库创建的最新文件(In_.. 和 Out_..)的 name

这是我目录中的文件示例:"C:\Customer\AppleFruit\"

In_20141101_001
In_20150102_002
In_20150130_0101
In_20150201_001
Out_20140501_101
Out_20141101_101
Out_20150101_152
Out_20150201_191

下面是我试图用 C++ 编写的代码:

#include "boost/filesystem.hpp"

boost::filesystem::path p( "C:\Customer\AppleFruit\");
typedef vector<path> vec; //sort path
vec inVec, outVec;
std::string inFilename, outFileName;

sort(v.begin(), v.end());
for (vec::const_iterator it (v.begin()); it != v.end(); ++it)
{
   if ( file_name_Starts_with_IN ) // here I am looking for the correct "if condition"
   inVec.push_back( *it);
   else if ( file_name_Starts_with_OUT ) //same thing here
   outVec.push_back( *it);
}
inFilename = inVec(end);
outFileName= outVec(end);

有什么想法吗..谢谢

评论后更新

如果你想要多于双向的分区,我建议将其设为 table 驱动:

Live On Coliru

#include <boost/filesystem.hpp>
#include <boost/range/iterator_range.hpp>
#include <boost/range/algorithm.hpp>
#include <vector>
#include <iostream>
#include <map>

int main() {
    using boost::filesystem::path;
    using boost::filesystem::directory_iterator;
    using boost::make_iterator_range;

    path p("."); // or "C:\Customer\AppleFruit\"

    std::map<std::string, std::vector<path> > bins {
        { "In_",  {} },
        { "Out_", {} },
      //{ "",     {} }, // remaining files
    };

    for(auto&& de: make_iterator_range(directory_iterator("."), {}))
        for(auto& bin: bins)
            if (de.path().filename().native().find(bin.first) == 0)
                bin.second.push_back(std::move(de));

    for(auto& bin: bins)
        for(auto& f : boost::sort(bin.second))
            std::cout << "Prefix '" << bin.first << "': " << f << "\n";
}

_旧答案:_

您可以将 partition_copy 与 suitable 谓词一起使用(这里,我使用了 lambda):

Live On Coliru

#include "boost/filesystem.hpp"
#include <vector>
#include <iostream>

int main() {
    boost::filesystem::path p("."); // or "C:\Customer\AppleFruit\"

    std::vector<boost::filesystem::path> inVec, outVec;

    std::partition_copy(
            boost::filesystem::directory_iterator(p), {},
            back_inserter(inVec),
            back_inserter(outVec),
            [](boost::filesystem::directory_entry const& de) { 
                return de.path().filename().native().find("In_") == 0;
            ; });

    std::sort(inVec.begin(),  inVec.end());
    std::sort(outVec.begin(), outVec.end());

    for(auto& f : inVec)
    {
        std::cout << f << "\n";
    }
}

列出所有以 "In_" 开头的文件名(区分大小写)。在 Coliru 上,来自使用

创建的文件
touch {In,Out}_{a..m}_file.txt

这意味着只有

"./In_a_file.txt"
"./In_b_file.txt"
"./In_c_file.txt"
"./In_d_file.txt"
"./In_e_file.txt"
"./In_f_file.txt"
"./In_g_file.txt"
"./In_h_file.txt"
"./In_i_file.txt"
"./In_j_file.txt"
"./In_k_file.txt"
"./In_l_file.txt"
"./In_m_file.txt"

匹配并打印,按排序顺序