当前位置:C++技术网 > 资讯 > WIN32_FIND_DATA结构体及文件查找程序小解

WIN32_FIND_DATA结构体及文件查找程序小解

更新时间:2015-11-01 22:10:38浏览次数:1+次

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;
通过这段代码我们可以总计有以下9种:文件的标题名、文件的属性(只读、存档,隐藏等)、文件的创建时间、文件的最后访问时间、文件的最后修改时间、文件大小的高位双字、文件大小的低位双字、保留、保留。在这里只有文件标题名和文件的长度可以通过CFile类比较方便的获得,而对于其他几种属性的获取和设置就无能为力了。
可以通过FindFirstFile()函数根据当前的文件存放路径查找该文件来把待操作文件的相关属性读取到WIN32_FIND_DATA结构中去:
WIN32_FIND_DATA ffd ;
HANDLE hFind = FindFirstFile("c:\\test.dat",&ffd);
我们看个小例子,来理解FindFirstFile的用法:



void CFindFileDlg::FindFile(CString szFileName)
{
    CString szFindName = szFileName;
///需要查找的文件名
 szFindName.Insert(szFileName.GetLength(), "\\*.*");
 
 WIN32_FIND_DATA	fd_Data;
 memset(&fd_Data, 0, sizeof(WIN32_FIND_DATA));
 HANDLE hFindFile =FindFirstFile(szFindName, &fd_Data);
 if (hFindFile != NULL)
 {
  while (FindNextFile(hFindFile, &fd_Data))
  {
   if (fd_Data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY && 
    (strcmp(fd_Data.cFileName, ".") != 0) &&
    (strcmp(fd_Data.cFileName, "..") != 0) &&
    (strcmp(fd_Data.cFileName, "...") != 0) )	//目录
   {
    CString szFullPath = szFileName;
    szFullPath.Insert(szFullPath.GetLength(), "\\");
    szFullPath.Insert(szFullPath.GetLength(), fd_Data.cFileName);
    FindFile(szFullPath);
   }
   else if (!(fd_Data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))	//文件
   {
    CString szFullName = szFileName;
    szFullName.Insert(szFullName.GetLength(), "\\");
    szFullName.Insert(szFullName.GetLength(), fd_Data.cFileName);
    if (stricmp(m_szFindFile.GetBuffer(0), fd_Data.cFileName) == 0)
    {
     m_RetList.AddString(szFullName);
    }
   }
  }
 }
 FindClose(hFindFile);

}
这段代码是实现我刚刚看书学习中的一个例子-查找电脑中的某个文件---源码中的一段代码。
这段代码就是使用函数FindFirstFile和FindNextFile利用递归功能来做的。
在这段代码中,我们看下这句代码:



if(findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 
这个判断语句是通过 将dwFileAttributes和FILE_ATTRIBUTE_DIRECTORY做位的与运算 
来判断所找到的项目是不是文件夹 
我们看下文件属性的包含内容(这只是一部分):


因为目录类在文件属性里,所以通过 findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY 
可以判断 dwFileAttributes项的值中是否是 FILE_ATTRIBUTE_DIRECTORY(目录),即判断所找到的项目是不是文件夹