打开给定文件夹中的所有文本文件

时间:2014-05-18 10:52:59

标签: c++ boost

我正在尝试打开文件夹和子文件夹中的所有文本文件,我将其作为参数提供给程序并在其中搜索文本。现在,如果我使用。而不是路径,它打开我想要的文件。但是,只要我将计算机中的任何其他文件夹作为参数(而不是目标文件的那个),它就不会打开文件。我该如何解决?我有Windows,我使用MinGw作为编译器。

#include <iostream>
#include <cstdlib>
#include "boost/program_options.hpp"
#include "boost/filesystem.hpp"
#include <iterator>
#include <fstream> 
namespace po = boost::program_options;
using namespace std;
using namespace boost;
using namespace boost::filesystem;



int main (int argc, char* argv[]) {

    // Declare the supported options.
    po::options_description desc("Allowed options");
    desc.add_options()
    ("folder", po::value<std::string>(), "find files in this folder")
    ("text", po::value<std::string>(), "text that will be searched for");

    po::variables_map vm;
    po::store(po::parse_command_line(argc, argv, desc), vm);
    po::notify(vm);

    filesystem::path current_dir (vm["folder"].as<string>());
    filesystem:: recursive_directory_iterator end_itr;//recursive lisatud

    for ( filesystem::recursive_directory_iterator itr( current_dir );
         itr != end_itr;
         ++itr )
    {
        //cout << itr->path ().filename () << endl;
        if(itr->path().filename().extension()==".txt"||itr->path().filename().extension()==".docx"||itr->path().filename().extension()==".doc"){
            ifstream inFile(itr->path().filename().string());
            //ifstream inFile("c:\\somefile.txt"); //this would open file

            cout<<itr->path().filename().string()<<endl; //this prints out all the file names without path, like  somefile2.txt for example
            while ( inFile )
            {
                std::string s;
                std::getline( inFile, s );
                if (inFile){
                    std::cout << s << "\n";
                    if(s.find(vm["text"].as<string>())!= string::npos){
                        cout<<"found it"<<endl;
                        }
                    }
            } 
        }
    }


    return EXIT_SUCCESS;
}

1 个答案:

答案 0 :(得分:3)

问题在于:

ifstream inFile(itr->path().filename().string())

或更具体地说,itr->path().filename()只返回文件的名称,而不是完整路径到该文件。如果该文件不在程序的当前工作目录中,则打开它时会出现问题:找不到该名称的文件,或者找到同名的本地文件,它不是你真正想要的文件!

虽然您正在执行递归目录迭代,但您当前的工作目录不会发生变化。

取消引用时,

itr->path()会返回boost::filesystem::path的实例...可能会找到该类的文档here。我相信你想做的是

ifstream inFile(itr->path().c_str());

然而,这可能不是规范或最有效的方式。