从以特定单词开头的目录中提取所有文件
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 驱动:
#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):
#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"
匹配并打印,按排序顺序
我有一个文件夹,其中包含名称为 "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 驱动:
#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):
#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"
匹配并打印,按排序顺序