• 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
    ", FullPathName);
    if (FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
    {
    DirectoryList(FullPathName);
    }
    }
    return 0;
    }
    void main()
    {
    DirectoryList("F:\123");
    printf("共%d个文件
    ",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
    
    
  • 相关阅读:
    实现JSON数据的存储和读取
    MediaPlayer类——播放视频和音乐
    网络编程浅析
    线程浅析
    I/O浅析
    fragment之间的信息交互——onActivityResult()不经过Activity
    命名规则
    String方法(一)
    面试小结
    找工作中......
  • 原文地址:https://www.cnblogs.com/kuangke/p/9397708.html
Copyright © 2020-2023  润新知