<iframe align="center" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog336280.html" frameborder="0" width="336" scrolling="no" height="280"></iframe>
在开发软件的过程里,经常需要维护目录里的数据。比如在开发银行的信用卡系统里,由于每天创建的
LOG
非常多,那么一个很大的硬盘,在
6
个月后,就占用了很多空间。这时就有这样的一个需求,把所有超过
6
个月的
LOG
数据定期删除掉。要实现这个功能就得遍历整个目录,把文件名称和文件创建的时间都超过
6
个月时间的文件删除掉。因此,就需使用到下面的
API
函数
FindFirstFile
和
FindNextFile
来实现这样的功能,
FindFirstFile
函数是查找到目录下的第一个文件或目录,
FindNextFile
函数是查找下一文件或目录。
函数
FindFirstFile
、
FindNextFile
和
FindClose
声明如下:
WINBASEAPI
__out
HANDLE
WINAPI
FindFirstFileA(
__inLPCSTR lpFileName,
__out LPWIN32_FIND_DATAA lpFindFileData
);
WINBASEAPI
__out
HANDLE
WINAPI
FindFirstFileW(
__inLPCWSTR lpFileName,
__out LPWIN32_FIND_DATAW lpFindFileData
);
#ifdef UNICODE
#define FindFirstFileFindFirstFileW
#else
#define FindFirstFileFindFirstFileA
#endif // !UNICODE
WINBASEAPI
BOOL
WINAPI
FindNextFileA(
__inHANDLE hFindFile,
__out LPWIN32_FIND_DATAA lpFindFileData
);
WINBASEAPI
BOOL
WINAPI
FindNextFileW(
__inHANDLE hFindFile,
__out LPWIN32_FIND_DATAW lpFindFileData
);
#ifdef UNICODE
#define FindNextFileFindNextFileW
#else
#define FindNextFileFindNextFileA
#endif // !UNICODE
WINBASEAPI
BOOL
WINAPI
FindClose(
__inout HANDLE hFindFile
);
lpFileName
是目录名称。一般使用通配符。
lpFindFileData
是找到的文件或目录属性。
hFindFile
是下一个文件或目录的句柄。
调用函数的例子如下:
#001#pragma once
#002
#003//
#004//
遍历一个目录的文件。
#005//
蔡军生
2007/10/25 QQ:9073204
深圳
#006//
#007class CFindFile
#008{
#009public:
#010
#011CFindFile(void)
#012{
#013 m_hFind = INVALID_HANDLE_VALUE;
#014 m_bFound = false;
#015 memset(&m_FindFileData,0,sizeof(m_FindFileData));
#016}
#017
#018~CFindFile(void)
#019{
#020 if (m_hFind != INVALID_HANDLE_VALUE)
#021 {
#022 ::FindClose(m_hFind);
#023 }
#024}
#025
#026//
找到第一个文件。
#027void First(LPCTSTR lpFileName)
#028{
#029 m_hFind = ::FindFirstFile(lpFileName,&m_FindFileData);
#030 if (m_hFind != INVALID_HANDLE_VALUE)
#031 {
#032 m_bFound = true;
#033 }
#034 else
#035 {
#036 m_bFound = false;
#037 }
#038}
#039
#040//
查找一下文件。
#041void Next(void)
#042{
#043 m_bFound = FindNextFile(m_hFind, &m_FindFileData) ? true:false;
#044}
#045
#046//
是否可以查找一下文件。
#047bool IsOK(void) const
#048{
#049 return m_bFound;
#050}
#051
#052//
返回当前文件的属性。
#053const WIN32_FIND_DATA& GetCurFile(void)
#054{
#055 return m_FindFileData;
#056}
#057
#058protected:
#059HANDLE m_hFind; //
保存当查找的位置句柄。
#060bool m_bFound; //
当前查找是否成功。
#061WIN32_FIND_DATA m_FindFileData;//
保存当前文件的属性。
#062
#063};
#064
使用如下:
#001//
查找文件。
#002 CFindFile findDemo;
#003 for (findDemo.First(_T(".\\*"));
#004 findDemo.IsOK();
#005 findDemo.Next())
#006 {
#007 //
#008 OutputDebugString(findDemo.GetCurFile().cFileName);
#009 OutputDebugString(_T("\r\n"));
#010 }
#011
在开发软件的过程里,经常需要维护目录里的数据。比如在开发银行的信用卡系统里,由于每天创建的
LOG
非常多,那么一个很大的硬盘,在
6
个月后,就占用了很多空间。这时就有这样的一个需求,把所有超过
6
个月的
LOG
数据定期删除掉。要实现这个功能就得遍历整个目录,把文件名称和文件创建的时间都超过
6
个月时间的文件删除掉。因此,就需使用到下面的
API
函数
FindFirstFile
和
FindNextFile
来实现这样的功能,
FindFirstFile
函数是查找到目录下的第一个文件或目录,
FindNextFile
函数是查找下一文件或目录。
函数
FindFirstFile
、
FindNextFile
和
FindClose
声明如下:
WINBASEAPI
__out
HANDLE
WINAPI
FindFirstFileA(
__inLPCSTR lpFileName,
__out LPWIN32_FIND_DATAA lpFindFileData
);
WINBASEAPI
__out
HANDLE
WINAPI
FindFirstFileW(
__inLPCWSTR lpFileName,
__out LPWIN32_FIND_DATAW lpFindFileData
);
#ifdef UNICODE
#define FindFirstFileFindFirstFileW
#else
#define FindFirstFileFindFirstFileA
#endif // !UNICODE
WINBASEAPI
BOOL
WINAPI
FindNextFileA(
__inHANDLE hFindFile,
__out LPWIN32_FIND_DATAA lpFindFileData
);
WINBASEAPI
BOOL
WINAPI
FindNextFileW(
__inHANDLE hFindFile,
__out LPWIN32_FIND_DATAW lpFindFileData
);
#ifdef UNICODE
#define FindNextFileFindNextFileW
#else
#define FindNextFileFindNextFileA
#endif // !UNICODE
WINBASEAPI
BOOL
WINAPI
FindClose(
__inout HANDLE hFindFile
);
lpFileName
是目录名称。一般使用通配符。
lpFindFileData
是找到的文件或目录属性。
hFindFile
是下一个文件或目录的句柄。
调用函数的例子如下:
#001#pragma once
#002
#003//
#004//
遍历一个目录的文件。
#005//
蔡军生
2007/10/25 QQ:9073204
深圳
#006//
#007class CFindFile
#008{
#009public:
#010
#011CFindFile(void)
#012{
#013 m_hFind = INVALID_HANDLE_VALUE;
#014 m_bFound = false;
#015 memset(&m_FindFileData,0,sizeof(m_FindFileData));
#016}
#017
#018~CFindFile(void)
#019{
#020 if (m_hFind != INVALID_HANDLE_VALUE)
#021 {
#022 ::FindClose(m_hFind);
#023 }
#024}
#025
#026//
找到第一个文件。
#027void First(LPCTSTR lpFileName)
#028{
#029 m_hFind = ::FindFirstFile(lpFileName,&m_FindFileData);
#030 if (m_hFind != INVALID_HANDLE_VALUE)
#031 {
#032 m_bFound = true;
#033 }
#034 else
#035 {
#036 m_bFound = false;
#037 }
#038}
#039
#040//
查找一下文件。
#041void Next(void)
#042{
#043 m_bFound = FindNextFile(m_hFind, &m_FindFileData) ? true:false;
#044}
#045
#046//
是否可以查找一下文件。
#047bool IsOK(void) const
#048{
#049 return m_bFound;
#050}
#051
#052//
返回当前文件的属性。
#053const WIN32_FIND_DATA& GetCurFile(void)
#054{
#055 return m_FindFileData;
#056}
#057
#058protected:
#059HANDLE m_hFind; //
保存当查找的位置句柄。
#060bool m_bFound; //
当前查找是否成功。
#061WIN32_FIND_DATA m_FindFileData;//
保存当前文件的属性。
#062
#063};
#064
使用如下:
#001//
查找文件。
#002 CFindFile findDemo;
#003 for (findDemo.First(_T(".\\*"));
#004 findDemo.IsOK();
#005 findDemo.Next())
#006 {
#007 //
#008 OutputDebugString(findDemo.GetCurFile().cFileName);
#009 OutputDebugString(_T("\r\n"));
#010 }
#011