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
 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM