zoukankan      html  css  js  c++  java
  • 文件夹遍历

    #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的人物最后也是一掊土
    向善不是目的,而是抚慰心灵,更多的感受幸福,感谢别人给你行善的机会
    相信老子的话:万物生于有,有生于无,一切的道理都源于一个无法证明的假设
    我是好是坏就自然而然的摆在那里,并不会因为别人的评价而改变什么,我也不需要别人用一张纸来说明我什么,世间最难得的是自由



    支持大额赞助:
  • 相关阅读:
    目录路径加反斜杠和不加的区别
    window端口号被占用解决
    个人博客设计记录
    2017/12/15
    添加code到github上
    跨域简介
    客户端存储
    window.name跨域
    BZOJ1305: [CQOI2009]dance跳舞
    BZOJ4872: [Shoi2017]分手是祝愿
  • 原文地址:https://www.cnblogs.com/sky-view/p/3943174.html
Copyright © 2011-2022 走看看