c++文件系统

在做游戏引擎的时候想着能有一个可以遍历文件夹文件的函数或者类这样可以批处理文件。

在网上找了找 大多都是关于vc下面所特有的文件遍历函数。后面有看了下 boost的filesystem.感觉符合我的要求,可是总是不能使用(链接的问题)

之后在网上见了一片关于文件变量的文章,感觉不错就略作改动 代码如下:

原文章链接在代码上面(fire fox不能复制啊-_-)

 

//stem from link: http://www.cnblogs.com/evlon/archive/2007/07/07/809391.html //modifed: [email protected] //2009-02-12 //cheng du #include <windows.h> #include <stdlib.h> #include <iostream> #include <string> #include <list> #include <vector> #include <algorithm> #include <iterator> #include <boost/tokenizer.hpp> #include <boost/algorithm/string.hpp> #include <boost/utility.hpp> using namespace std; using namespace boost; const vector<string> token_str(const string &str) { vector<string> str_ret; tokenizer<> suff(str); for(tokenizer<>::iterator itr=suff.begin(); itr!=suff.end();++itr) str_ret.push_back(*itr); return str_ret; } class file_operator { public: virtual void operator()(const string& path, const string &suffix,LPWIN32_FIND_DATA pfdd) = 0; }; bool find_path_files(const string &path, const string &suffix,bool subdir,file_operator* file_ptr) { WIN32_FIND_DATA fd; list<string> directories; directories.push_back(path); while(directories.size() > 0) { string path = directories.front(); directories.pop_front(); string find = path + "//*"; HANDLE hFind = NULL; hFind = ::FindFirstFile(find.c_str(),&fd); if (hFind == INVALID_HANDLE_VALUE) { return false; } bool finished = false; while(finished == false) { if(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { string filename(fd.cFileName); if(subdir == true) { cout<<filename<<endl; if(filename != "." && filename != "..") { directories.push_back(path + "//" + filename); } } } else { if(file_ptr != NULL) { (*file_ptr)(path,suffix,&fd); } } bool ret = ::FindNextFile(hFind,&fd); if(ret != true) { finished = true; } } ::FindClose(hFind); } return true; } class file_list_dir : public file_operator { public: void operator()(const string& path,const string &suffix,LPWIN32_FIND_DATA pfd) { WIN32_FIND_DATA& fd = *pfd; string file(path + "//" + fd.cFileName); vector<string> suff = token_str(suffix); vector<string>::iterator itr = suff.begin(); while(itr != suff.end()) { if(true == ends_with(file,(*itr))) { files.push_back(file); break; } itr ++; } return; } public: list<string>& GetFiles() { return files; } private: vector<string> &get_suffixes(const string &suffix) { tokenizer<> suf(suffix); for(tokenizer<>::iterator itr=suf.begin(); itr!=suf.end();++itr) suffixes.push_back(*itr); } private: list<string> files; vector<string> suffixes; }; int main() { file_list_dir oper; //遍历每个文件,进行操作 find_path_files("E://MP3文件",".mp3 .wma",false, &oper); const list<string> &files = oper.GetFiles(); copy(files.begin(),files.end(),ostream_iterator<string>(cout,"/n")); system("PAUSE"); return 1; }

这里面涉及了字符串切割, 匹配 都是使用 boost处理的

 

不过这个以后还要修改  以满足跨平台的需要。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(C++,String,File,iterator,Path,token)