zoukankan      html  css  js  c++  java
  • Win32下C++遍历目录和文件的源码

    #include<windows.h>

    #include<iostream>

    #include<string>

    using namespace std;

    //只能处理目录:lpPath只能是路径

    void find(char *lpPath)

    {

        char szFind[MAX_PATH];

       char szFile[MAX_PATH];

        WIN32_FIND_DATA FindFileData;

        strcpy(szFind,lpPath);

        strcat(szFind,"//*.*");

        HANDLE hFind=::FindFirstFile(szFind,&FindFileData);

        if(INVALID_HANDLE_VALUE == hFind)    return;

        while(TRUE)

        {

            if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)

            {

                if(FindFileData.cFileName[0]!='.')

                {

                    strcpy(szFile,lpPath);

                    strcat(szFile,"//");

                    strcat(szFile,FindFileData.cFileName);

                    find(szFile);

                }

            }

            else

            {      

                   cout<<FindFileData.cFileName<<endl;

            }

            if(!FindNextFile(hFind,&FindFileData))

                break;

        }

        FindClose(hFind); 

    }

    //可同时处理目录和文件:path可以是路径,也可以是文件名,或者文件通配符

    void _find(string path){ 

         //取路径名最后一个"//"之前的部分,包括"//"

        string prefix=path.substr(0,path.find_last_of('//')+1);

        WIN32_FIND_DATA FindFileData;

        HANDLE hFind=::FindFirstFile(path.c_str(), &FindFileData);

        if(INVALID_HANDLE_VALUE == hFind)

        {

           cout<<"文件通配符错误"<<endl;

          return;

       }

        while(TRUE)

        {

          //目录

            if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)

            {

                //不是当前目录,也不是父目录

                if(FindFileData.cFileName[0]!='.')

                {

                    //查找下一级目录

                    _find(prefix+FindFileData.cFileName+"//"+"*.*");

                }

            }

            //文件

            else

            {   

                 cout<<FindFileData.cFileName<<endl;

            }

            if(!FindNextFile(hFind,&FindFileData))

                  break;

        }

        FindClose(hFind); 

    }

    void main(){

        //find("E:");//目录:E

        //_find("E://*.*");//E盘下所有文件

        string str="./test"; //这里指定的是目录

        //string path;

        //cout<<"请输入文件通配符:"<<flush;

        //cin>>path;

        // str=str+path;

        find((char*)str.c_str());//可以处理"."".." 不可以处理"*""..//*" 

        //_find(str);//可以处理"*""..//*" 不可以处理"."".."

        system("pause");

    }

    复制代码

    其中有个结构体,它是C++自带的,是这样的:

    typedef struct _WIN32_FIND_DATA{

       DWORD dwFileAttributes; // 文件属性

       FILETIME ftCreationTime; // 文件创建时间

       FILETIME ftLastAccessTime; // 文件最后一次访问时间

       FILETIME ftLastWriteTime; // 文件最后一次修改时间

       DWORD nFileSizeHigh; // 文件长度高 32 

       DWORD nFileSizeLow; // 文件长度低 32 

       DWORD dwReserved0; // 系统保留

       DWORD dwReserved1; // 系统保留

       TCHAR cFileName[ MAX_PATH ]; // 长文件名

       TCHAR cAlternateFileName[ 14 ]; // 文件的可选名

    } WIN32_FIND_DATA;

  • 相关阅读:
    fixture中使用request参数
    python 使用values() 获取字典中所有的值
    php连接mssql数据库的方法以及错误设置
    C#使用tabcontrol控件可操作多窗体嵌入以及双击窗口名称可关闭
    ie下js调试超级爽的工具IE WebDeveloper V2 (附注册码)
    php curl 下载文件
    www.qian14.cn 终于解决了这个问题
    二级缓存伪优化揭秘(转)
    向访客和爬虫显示不同的内容
    我的新博客地址!
  • 原文地址:https://www.cnblogs.com/lizihong/p/4323011.html
Copyright © 2011-2022 走看看