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;

 





你可能感兴趣的:(Win32)