利用FindFirstFile和FindNextFile查找文件或遍历文件夹

 FindFirstFile()根据文件名查找文件函数执行成功返回一个搜索句柄,出错则返回INVALID_HANDLE_VALUE常数,查找结束应该用FindClose函数关闭搜索句柄函数原型:

HANDLE WINAPI FindFirstFile(
  _In_   LPCTSTR lpFileName,
  _Out_  LPWIN32_FIND_DATA lpFindFileData
);
  lpFileName为欲搜索的文件名。格式可如下:

c:\Windows\* //在c:\Windows目录中查找所有文件
c:\Windows\System32\*.dll //在c:\Windows\System32目录中查找所有dll文件
c:\Windows\System.ini ;在c:\Windows目录中查找System.ini文件
c:\Windows\a???.* // 在c:\Windows目录中查找所有以a开头的文件名长度.为4个字符的文件
 lpFindFileData为WIN32_FIND_DATA结构,这个结构用于装载与找到的文件有关的信息,该结构可用于后续的搜索:

typedef struct _WIN32_FIND_DATA {

   DWORD dwFileAttributes; //文件属性

   FILETIME ftCreationTime; // 文件创建时间

   FILETIME ftLastAccessTime; // 文件最后一次访问时间

   FILETIME ftLastWriteTime; // 文件最后一次修改时间

   DWORD nFileSizeHigh; // 文件长度高32位

   DWORD nFileSizeLow; // 文件长度低32位

   DWORD dwReserved0; // 系统保留

   DWORD dwReserved1; // 系统保留

   TCHAR cFileName[ MAX_PATH ]; // 长文件名

   TCHAR cAlternateFileName[ 14 ]; // 8.3格式文件名

} WIN32_FIND_DATA, *PWIN32_FIND_DATA;

  dwFileAttributes字段可以是下面取值的组合,通过这个字段可以检查找到的究竟是一个文件还是一个子目录,以及其他的文件属性

● FILE_ATTRIBUTE_ARCHIVE——文件包含归档属性。
● FILE_ATTRIBUTE_COMPRESSED——文件和目录被压缩。
● FILE_ATTRIBUTE_DIRECTORY——找到的是一个目录。
● FILE_ATTRIBUTE_HIDDEN——文件包含隐含属性。
● FILE_ATTRIBUTE_NORMAL——文件没有其他属性。
● FILE_ATTRIBUTE_READONLY——文件包含只读属性。
● FILE_ATTRIBUTE_SYSTEM——文件包含系统属性。
● FILE_ATTRIBUTE_TEMPORARY——文件是一个临时文件。
调用完FindFirstFile()后可以调用FindNextFile()函数查找下一个文件,函数原型:
BOOL WINAPI FindNextFile(
  _In_   HANDLE hFindFile,
  _Out_  LPWIN32_FIND_DATA lpFindFileData
);
eg:遍历文件夹,输出普通文件或目录名
PrintFileName("E:\\");

void PrintFileName(char* m_pFileDirectory)
{
	char pLogFileDirectory[MAX_PATH] = { 0 };
	strcpy_s(pLogFileDirectory, MAX_PATH, m_pFileDirectory);
	int iLen = strlen(pLogFileDirectory);
	pLogFileDirectory[iLen] = '*';
	pLogFileDirectory[iLen+1] = 0;

	WIN32_FIND_DATAA findFileData;
	HANDLE hFind = FindFirstFileA(pLogFileDirectory, &findFileData);
	if (INVALID_HANDLE_VALUE == hFind)
	{
		int iErrno = GetLastError();
		return;
	}

	BOOL bRet = FALSE;
	for (;;)
	{
		if (findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
		{
			//目录
			if (!strcmp(findFileData.cFileName, ".") || !strcmp(findFileData.cFileName, ".."))
			{
				//.或..
			}
			else
			{
				if (findFileData.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM)
				{
					//系统目录
				}
				else
				{
					if (findFileData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)
					{
						//隐藏目录
					}
					else
					{
						//普通目录
						printf("%s\n", findFileData.cFileName);
					}
				}
			}
		}
		else
		{
			//文件
			if (findFileData.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM)
			{
				//系统文件
			}
			else
			{
				if (findFileData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)
				{
					//隐藏文件
				}
				else
				{
					//普通文件
					printf("%s\n", findFileData.cFileName);
				}
			}
		}

		bRet = FindNextFileA(hFind, &findFileData);
		if (!bRet)
			break;
	}

	FindClose(hFind);
}

文章出处:http://baike.baidu.com/link?url=DxvpykBeeJxMOeWj39T8XeisYrpZ9vl6Apyi1zr-CA4Q4Jj80gjJotKZ8Is242i76N4PPaeyBfWaTwvBcA_56K

参考文章:http://www.cnblogs.com/chenkunyun/archive/2012/03/24/2415727.html

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值