Angelo Lee's Blog
This is my kingdom .If i don't fight for it ,who will ?
#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 2012-11-27 21:10  Angelo Lee  阅读(305)  评论(0编辑  收藏  举报