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

时间:2015-02-03 20:01:05

标签: c++ boost

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

以下是我目录中的文件示例:“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);

请知道。谢谢

1 个答案:

答案 0 :(得分:2)

评论后

更新

如果你想要一个超过两个分区,我建议把它作为表驱动:

<强> 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";
}

_Old回答:_

您可以将partition_copy与合适的谓词一起使用(这里,我使用的是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"

按照排序顺序进行匹配和打印