VC下遍历文件夹中的所有文件的几种方法

一、使用::FindFirstFile和::FindNextFile方法
#include "StdAfx.h"
#include <windows.h>
#include <stdio.h>
#include <string.h>
#define LEN 1024
int FileCount = 0;
// 深度优先递归遍历目录中所有的文件
BOOL  DirectoryList(LPCSTR Path)
{
WIN32_FIND_DATA FindData;
HANDLE hError;

char FilePathName[LEN];
// 构造路径
char FullPathName[LEN];
strcpy(FilePathName, Path);
strcat(FilePathName, "\\*.*");
hError = FindFirstFile(FilePathName, &FindData);
if (hError == INVALID_HANDLE_VALUE)
{
printf("搜索失败!");
return 0;
}
while(::FindNextFile(hError, &FindData))
{
// 过虑.和..
if (strcmp(FindData.cFileName, ".") == 0
|| strcmp(FindData.cFileName, "..") == 0 )
{
continue;
}
// 构造完整路径
wsprintf(FullPathName, "%s\\%s", Path,FindData.cFileName);
FileCount++;
// 输出本级的文件
printf("%s\n", FullPathName);
if (FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
DirectoryList(FullPathName);
}
}
return 0;
}
void main()
{
DirectoryList("F:\\123");
printf("共%d个文件\n",FileCount);
}
二、利用CFileFind类较简洁的实现该功能
void CModelDlg::FindBmpFile(CString strFoldername)
{
    CString m_cstrFileList="";
    CFileFind tempFind;
    BOOL bFound; //判断是否成功找到文件
    bFound=tempFind.FindFile(strFoldername   +   "\\*.*");   /修改" "内内容给限定查找文件类型
    CString strTmp;   //如果找到的是文件夹 存放文件夹路径
    while(bFound)      //遍历所有文件
    {
        bFound=tempFind.FindNextFile(); //第一次执行FindNextFile是选择到第一个文件,以后执行为选择
                                                              //到下一个文件
           if(!tempFind.IsDots()) continue; //如果找到的是返回上层的目录 则结束本次查找
if(tempFind.IsDirectory())   //找到的是文件夹,则遍历该文件夹下的文件
            {
                strTmp="";
                strTmp=tempFind.GetFilePath();
                FindFile(strTmp);
            }
            else
            {
                strTmp=tempFind.GetFileName(); //保存文件名,包括后缀名
                 // 在此处添加对找到文件的处理
            }
    }
    tempFind.Close();
    return;
}
三、使用IO.H中的_findfirst和_findnext方法
在IO.H、WCHAR.H中提供了_finddata_t, _wfinddata_t, _wfinddatai64_t 结构,通过_findfirst可以得到满足条件的第一个文件的句柄,如下:
long _findfirst( char *filespec, struct _finddata_t *fileinfo ),然后你可以使用_findnext函数得到用_findfirst的句柄后的文件指针,如此就可以遍历所有满足条件的文件。其中_finddata_t 结构包括了文件的相关信息:文件名,创建日前等属性,你可以从你的机器中的IO.H文件中查找相应的定义。当然不要忘了,使用_findclose 函数关闭相应句柄


例如:下面程序实现把文件夹中的文件名字显示在窗口的标题栏中。
CString pathWild ="你的目录//*.jpg" ;
 struct _finddata_t c_file;
 long hFile;
 if( (hFile = _findfirst( LPCTSTR(pathWild), &c_file )) == -1L )
 {
  ::AfxMessageBox("No image files in current directory!/n" ) ;
 }
else
 {一、使用::FindFirstFile和::FindNextFile方法
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);
}
二、利用CFileFind类较简洁的实现该功能
void CModelDlg::FindBmpFile(CString strFoldername)
{
    CString m_cstrFileList="";
    CFileFind tempFind;
    BOOL bFound; //判断是否成功找到文件
    bFound=tempFind.FindFile(strFoldername   +   "\\*.*");   /修改" "内内容给限定查找文件类型
    CString strTmp;   //如果找到的是文件夹 存放文件夹路径
    while(bFound)      //遍历所有文件
    {
        bFound=tempFind.FindNextFile(); //第一次执行FindNextFile是选择到第一个文件,以后执行为选择
                                                              //到下一个文件
           if(!tempFind.IsDots()) continue; //如果找到的是返回上层的目录 则结束本次查找
            if(tempFind.IsDirectory())   //找到的是文件夹,则遍历该文件夹下的文件
            {
                strTmp="";
                strTmp=tempFind.GetFilePath();
                FindFile(strTmp);
            }
            else
            {
                strTmp=tempFind.GetFileName(); //保存文件名,包括后缀名
                 // 在此处添加对找到文件的处理
            }
    }
    tempFind.Close();
    return;
}


三、使用IO.H中的_findfirst和_findnext方法
在IO.H、WCHAR.H中提供了_finddata_t, _wfinddata_t, _wfinddatai64_t 结构,通过_findfirst可以得到满足条件的第一个文件的句柄,如下:
long _findfirst( char *filespec, struct _finddata_t *fileinfo ),然后你可以使用_findnext函数得到用_findfirst的句柄后的文件指针,如此就可以遍历所有满足条件的文件。其中_finddata_t 结构包括了文件的相关信息:文件名,创建日前等属性,你可以从你的机器中的IO.H文件中查找相应的定义。当然不要忘了,使用_findclose 函数关闭相应句柄


例如:下面程序实现把文件夹中的文件名字显示在窗口的标题栏中。
CString pathWild ="你的目录//*.jpg" ;
 struct _finddata_t c_file;
 long hFile;
 if( (hFile = _findfirst( LPCTSTR(pathWild), &c_file )) == -1L )
 {
  ::AfxMessageBox("No image files in current directory!/n" ) ;
 }
else
 {
  do 
  {
   AfxGetMainWnd()->SetWindowText(c_file.name);
  } while (_findnext(hFile, &c_file) == 0);
 }
 _findclose(hFile);
对了,别忘了在你的工程中包括头文件IO.H
  do {
   AfxGetMainWnd()->SetWindowText(c_file.name);
  } while (_findnext(hFile, &c_file) == 0);
 }
 _findclose(hFile);
对了,别忘了在你的工程中包括头文件IO.H

jpg改rar
 
 

猜你喜欢

转载自www.cnblogs.com/kuangke/p/9397708.html