#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;

posted on 2015-03-09 10:49  lizihong  阅读(1153)  评论(0编辑  收藏  举报