2015-02-03 3 views
2

У меня есть папка с файлами с такими именами «In_YMD_xxx» и «Out_YMD_xxx», где YMD - год, месяц и день (exp 20150101), а xxx - его idx, например 050. Я ищу простой способ прочитать имя последних файлов (In_ .. и Out_ ..), которые были созданы с использованием библиотеки boost в C++.извлечь все файлы из каталога, начинающегося с определенного слова

Вот пример файлов, которые у меня есть в моем каталоге: "C: \ Клиент \ 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); 

Любая идея please..Thanks

+3

Может быть, вы должны избежать строку, содержащую ваш путь или использовать/вместо of \ в качестве разделителя пути. – drescherjm

ответ

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 с подходящим предикатом (здесь я использовал лампу BDA):

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" 

подбираются и распечатаны в упорядоченном

+0

Рекомендуется использовать std :: partition_copy, но если есть файл с другим именем, который был сохранен в том же каталоге с помощью «ошибок», он также будет извлечен также из Out_files ... – Sally

+0

@Sally Действительно. Я не понял этого требования. В этом случае: ** [Live On Coliru] (http://coliru.stacked-crooked.com/a/d6f13db2c9b9a0dc) ** – sehe

+0

Отличный результат Спасибо, он работает. – Sally

Смежные вопросы