您的位置:首页 > 其它

遍历目录 常用FindFirstFile()和FindNextFile()

2012-11-23 21:54 405 查看


FindFirstFile  

函数功能描述:查找指定目录的第一个文件或目录并返回它的句柄

函数原型 :
          HANDLE FindFirstFile(
                                LPCTSTR lpFileName,                // 目录名
                                LPWIN32_FIND_DATA lpFindFileData   // 数据缓冲区
                              );

参数:

lpFileName 
[输入] 指向字符串的指针用于指定一个有效的目录。

lpFindFileData 
[输出] 指向一个WIN32_FIND_DATA的指针,用于存放找到文件或目录的信息。 

返回值:
如果成功,则返回找到文件或目录的句柄。在FindNextFile和FindClose函数中会用到此句柄。
如果失败,返回INVALID_HANDLE_VALUE。要获得更多的信息调用GetLastError函数。

备注:
指定目录的形式应该为"..\\abc\\*.*"   就是在abc目录中找第一个文件或目录。
WIN32_FIND_DATA的结构中包含很多文件或目录的有用信息,后面的程序或许会用到。该结构如下:

typedef struct _WIN32_FIND_DATA {
   DWORD     dwFileAttributes; 
   FILETIME ftCreationTime; 
   FILETIME ftLastAccessTime; 
   FILETIME ftLastWriteTime; 
   DWORD     nFileSizeHigh; 
   DWORD     nFileSizeLow; 
   DWORD     dwReserved0; 
   DWORD     dwReserved1; 
   TCHAR     cFileName[ MAX_PATH ]; 
   TCHAR     cAlternateFileName[ 14 ]; 
} WIN32_FIND_DATA, *PWIN32_FIND_DATA;

使用环境:
windows nt 3.1 和以后都可以使用
windows 95 和以后都可以使用
头文件   windows.h
使用     Kernel32.lib    库

示例代码段
#include "windows.h"

int main(int argc, char *argv[])
{
   WIN32_FIND_DATA FindFileData;
   HANDLE hFind;

   printf ("Target file is %s.\n", argv[1]);

   hFind = FindFirstFile(argv[1], &FindFileData);     //注意目录的形式后面要有*.*

   if (hFind == INVALID_HANDLE_VALUE) {
     printf ("Invalid File Handle. Get Last Error reports %d\n", GetLastError ());
   } else {
     printf ("The first file found is %s\n", FindFileData.cFileName);
     FindClose(hFind);
   }

   return (0);
}

下面是一个输出目录里所用文件名的代码:
#include<iostream>

#include<stdio.h>

#include<windows.h>

#include<winbase.h>

#include<string.h>

using namespace std; 

 //遍历一个目录的文件。

 //蔡军生 2007/10/25 QQ:9073204 深圳

 class CFindFile

 {

 public:

  CFindFile(void)

  {

          m_hFind = INVALID_HANDLE_VALUE;

          m_bFound = false;

         memset(&m_FindFileData,0,sizeof(m_FindFileData));

  }

  ~CFindFile(void)

  {

         if (m_hFind != INVALID_HANDLE_VALUE)

         {

              ::FindClose(m_hFind);

         }

  }

  //找到第一个文件。

  void First(LPCTSTR lpFileName)

  {

         m_hFind = ::FindFirstFile(lpFileName,&m_FindFileData);

         if (m_hFind != INVALID_HANDLE_VALUE)

         {

                m_bFound = true;

         }

         else

         {

                m_bFound = false;

         }

  }

  //查找一下文件。

  void Next(void)

  {

         m_bFound = FindNextFile(m_hFind, &m_FindFileData) ? true:false;

  }

  //是否可以查找一下文件。

  bool IsOK(void) const

  {

         return m_bFound;

  }

  //返回当前文件的属性。

  const WIN32_FIND_DATA& GetCurFile(void) 

  {

         return m_FindFileData;

  }

 protected:

  HANDLE m_hFind; //保存当查找的位置句柄。

  bool m_bFound; //当前查找是否成功。

  WIN32_FIND_DATA m_FindFileData;//保存当前文件的属性。

};
int main()

{

 char *a="C:\\*";

    CFindFile findDemo;

 for (findDemo.First(a); 

 findDemo.IsOK(); 

 findDemo.Next())

 {

  cout<<findDemo.GetCurFile().cFileName;

  cout<<"  xx\n";

 }

 return 0;

}
这样查询到的结果会包括 .和..

void DirectoryList(LPCSTR Path)
{
WIN32_FIND_DATA FindData;
HANDLE hError;
int FileCount = 0;
char FilePathName[LEN];

char FullPathName[LEN];
strcpy(FilePathName, Path);
strcat(FilePathName, "\\*.*");
hError = FindFirstFile(FilePathName, &FindData);
if (hError == INVALID_HANDLE_VALUE)
{
printf("Search error!");
return;
}
while(::FindNextFile(hError, &FindData))
{
if (strcmp(FindData.cFileName, ".") == 0
|| strcmp(FindData.cFileName, "..") == 0 )
{
continue;
}

wsprintf(FullPathName, "%s\\%s", Path,FindData.cFileName);
FileCount++;
printf("\n%d  %s  ", FileCount, FullPathName);

if (FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
printf("<Dir>");
DirectoryList(FullPathName);
}
}
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: