文件夹遍历
#include <iostream> #include <string.h> #include <io.h> #include <vector> #include <algorithm> using namespace std; void finddir(const string& name,_finddata_t* fl) { vector<string> str; long hd=_findfirst(string(name).append("*.*").c_str(),fl); if(hd==-1){_findclose(hd);return;} do { if(fl->attrib&_A_SUBDIR && (!strcmp(fl->name,".")||!strcmp(fl->name,"..")))continue; if(fl->attrib&_A_SUBDIR){cout<<string(name).append(fl->name).append("\\").c_str()<<endl;str.push_back(string(name).append(fl->name).append("\\"));continue;} cout<<name.c_str(); cout<<fl->name<<endl; }while(_findnext(hd,fl)!=-1); _findclose(hd); for(auto it=str.begin();it!=str.end();++it)finddir(*it,fl); } int main() { _finddata_t fl; finddir(string("D:\\"),&fl); return 0; }
多线程版本
#include "stdafx.h" #include <iostream> // std::cout #include <atomic> // std::atomic #include <thread> // std::thread #include <vector> // std::vector #include <io.h> #include <mutex> #include <thread> #include <chrono> #include <type_traits> #include <string> #include <bitset> using namespace std; #define THREAD_COUNT 32 vector <string> directory; mutex mtx; bitset<THREAD_COUNT> bst; atomic<int> file_count; atomic<int> folder_count; void print_a_dir(string dir) { _finddata_t* fd=new _finddata_t; long hdl=_findfirst(string(dir).append("*.*").c_str(),fd); if(hdl==-1){_findclose(hdl);return;} do { if(fd->attrib&_A_SUBDIR && (fd->name)[0]=='.')continue; if(fd->attrib&_A_SUBDIR){string temp(dir+fd->name+"\\");folder_count++;mtx.lock();directory.push_back(temp);mtx.unlock();continue;} file_count++; //cout<<dir<<fd->name<<endl; }while(_findnext(hdl,fd)!=-1); _findclose(hdl); } void thread_func(int th_index) { string dir; while(1) { mtx.lock(); if(directory.empty()){bst[th_index]=1;if(bst.all()){mtx.unlock();return;}mtx.unlock();continue;} dir=directory.back(); directory.pop_back(); mtx.unlock(); bst[th_index]=0; print_a_dir(dir); } } int main () { vector<thread> v_thread; directory.push_back("D:\\Documents\\"); cout<<directory[0]<<endl; for(int i=0;i<THREAD_COUNT;i++) v_thread.push_back(thread(thread_func,i)); for(auto& th : v_thread )th.join(); cout<<"folder count:"<<folder_count<<endl; cout<<"file count:"<<file_count<<endl; return 0; }
相信世界是平的
谨记四个字“修身养性”
大江东去浪淘尽英雄,再牛B的人物最后也是一掊土
向善不是目的,而是抚慰心灵,更多的感受幸福,感谢别人给你行善的机会
相信老子的话:万物生于有,有生于无,一切的道理都源于一个无法证明的假设
我是好是坏就自然而然的摆在那里,并不会因为别人的评价而改变什么,我也不需要别人用一张纸来说明我什么,世间最难得的是自由
谨记四个字“修身养性”
大江东去浪淘尽英雄,再牛B的人物最后也是一掊土
向善不是目的,而是抚慰心灵,更多的感受幸福,感谢别人给你行善的机会
相信老子的话:万物生于有,有生于无,一切的道理都源于一个无法证明的假设
我是好是坏就自然而然的摆在那里,并不会因为别人的评价而改变什么,我也不需要别人用一张纸来说明我什么,世间最难得的是自由
支持大额赞助:
![](https://images.cnblogs.com/cnblogs_com/sky-view/883309/o_%E6%97%A0%E6%A0%87%E9%A2%98.png)