我有一个文件夹,其中包含这些名称为“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);
请知道。谢谢
答案 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"
按照排序顺序进行匹配和打印