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