遍历目录 常用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);
		}
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值