获取具有相同扩展名的文件列表并处理它们

时间:2017-04-05 18:30:59

标签: c++ vector boost

我在这里实现最佳答案时遇到了问题:How to get list of files with a specific extension in a given folder

我试图获得所有" .vol"目录argv [2]中的文件,并对我找到的每个文件进行一些批处理。我想将每个文件传递给ParseFile函数,该函数将字符串作为参数。

// return the filenames of all files that have the specified extension
// in the specified directory and all subdirectories
vector<string> get_all(const boost::filesystem::path& root, const string& ext, vector<boost::filesystem::path>& ret){
    if(!boost::filesystem::exists(root) || !boost::filesystem::is_directory(root)) return vector<string>();

    boost::filesystem::recursive_directory_iterator it(root);
    boost::filesystem::recursive_directory_iterator endit;

    while(it != endit)
    {
        if(boost::filesystem::is_regular_file(*it) && it->path().extension() == ext) ret.push_back(it->path().filename());
        ++it;
        cout << *it << endl; 
        return *ret;   // errors here
    }
}



... main function


if (batch) {
   vector<boost::filesystem::path> retVec;
   vector<boost::filesystem::path> volumeVec = get_all(boost::filesystem::path(string(argv[2])), string(".vol"), retVec);


// convert volume files in volumeVec to strings and pass to ParseFile
   ParseFile(volumeFileStrings);

}

我遇到了get_all函数以及如何正确返回向量的问题。

1 个答案:

答案 0 :(得分:1)

将return语句更改为vector<boost::filesystem::path>并从函数的参数中删除ret,而是在函数中创建ret,如下所示:

vector<boost::filesystem::path> ret;

然后,您想要在return ret;循环下方移动ret的返回语句while,以便将所有文件名追加到ret

您的代码将如下所示:

vector<boost::filesystem::path> get_all(const boost::filesystem::path& root, const string& ext){
    if(!boost::filesystem::exists(root) || !boost::filesystem::is_directory(root)) return;

    boost::filesystem::recursive_directory_iterator it(root);
    boost::filesystem::recursive_directory_iterator endit;
    vector<boost::filesystem::path> ret;
    while(it != endit)
    {
        if(boost::filesystem::is_regular_file(*it) && it->path().extension() == ext) ret.push_back(it->path().filename());
        ++it;
        cout << *it << endl; 
    }
    return ret;
}