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

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);
		}
	}
}


posted @ 2012-11-23 21:54  N3verL4nd  阅读(720)  评论(0编辑  收藏  举报