vc 遍历目录下的文件与总数

来源:互联网 发布:淘宝素材图片 编辑:程序博客网 时间:2024/05/17 03:13
使用::FindFirstFile和::FindNextFile方法#include "StdAfx.h"#include <windows.h>#include <stdio.h>#include <string.h>#define LEN 1024int 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
原创粉丝点击