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



    支持大额赞助:
  • 相关阅读:
    hihoCoder #1176 : 欧拉路·一 (简单)
    228 Summary Ranges 汇总区间
    227 Basic Calculator II 基本计算器II
    226 Invert Binary Tree 翻转二叉树
    225 Implement Stack using Queues 队列实现栈
    224 Basic Calculator 基本计算器
    223 Rectangle Area 矩形面积
    222 Count Complete Tree Nodes 完全二叉树的节点个数
    221 Maximal Square 最大正方形
    220 Contains Duplicate III 存在重复 III
  • 原文地址:https://www.cnblogs.com/sky-view/p/3943174.html
Copyright © 2011-2022 走看看