【转载】VC遍历文件夹下所有文件和文件夹

一、先介绍一个结构WIN32_FIND_DATA

VC遍历文件夹下所有文件和文件夹
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;



可以通过FindFirstFile()函数,根据文件路径把待操作文件的相关属性读取到WIN32_FIND_DATA结构中去:


WIN32_FIND_DATA ffd;
HANDLE hFind = FindFirstFile("c://test.dat",&ffd);



二、函数FindFirstFile


1、声明:HANDLE FindFirstFile(LPCTSTR lpFileName,LPWIN32_FIND_DATA lpFindFileData);


2、参数:


lpFileName String,欲搜索的文件名。可包含通配符,并可包含一个路径或相对路径名
lpFindFileData WIN32_FIND_DATA,一个WIN32_FIND_DATA指针,用于装载与找到的文件有关的信息,该结构可用于后续的搜索


3、返回值:


如执行成功,返回一个搜索句柄。
如果出错,返回一个INVALID_HANDLE_VALUE常数,一旦不再需要,应该用FindClose函数关闭这个句柄。


4、功能


读取文件信息到一个WIN32_FIND_DATA结构中,返回这个文件的句柄。


5、注释:


由这个函数返回的句柄可以作为一个参数用于FindNextFile函数。
这样一来,就可以方便的枚举出与lpFileName参数指定的文件名相符的所有文件(是指文件名含有通配符)。


三、函数FindNextFile


1、声明BOOL FindNextFile(HANDLE hFindFile, LPWIN32_FIND_DATA lpFindFileData);


2、参数:


HANDLE hFindFile搜索的文件句柄,函数执行的时候搜索的是此句柄的下一文件
LPWIN32_FIND_DATA lpFindFileData一个WIN32_FIND_DATA指针,

3、返回值:


如果调用成功返回一个非0值;调用失败,返回为0,可调用GetLastError来获取错误信息

4、功能


继续查找FindFirstFile函数搜索后的文件
5、注释:

这个函数可以连续调用,以方便的枚举出与lpFileName参数指定的文件名相符的所有文件
 
四、下面是遍历代码

#include<windows.h>
#include<iostream>
#include<string>


using namespace std;


//只能处理目录:lpPath只能是路径
 
find(char * lpPath)
{
  char szFind[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;
    }
    if(!FindNextFile(hFind,&FindFileData))
{  
break;
}
  }


  FindClose(hFind);
}

你可能感兴趣的:(【转载】VC遍历文件夹下所有文件和文件夹)