文章目录

  • `_WIN32_FIND_DATA`
  • 作用:
  • FindFirstFile
  • 函数功能
  • 函数声明
  • 第一个参数
  • 第二个参数
  • 返回值(搜索句柄)
  • FindNextFile
  • 函数功能
  • 函数声明
  • 第一个参数
  • 第二个参数
  • 返回值(BOOL)
  • 实现代码:
  • 注意点:

首先需要介绍 陌生的东西

_WIN32_FIND_DATA

作用:

关于文件的全部属性信息。总计有以下以下9种:文件的标题名、文件的属性(只读、存档,隐藏等)、文件的创建时间、文件的最后访问时间、文件的最后修改时间、文件大小的高位双字、文件大小的低位双字、保留、保留。在这里只有文件标题名和文件的长度可以通过CFile类比较方便的获得,而对于其他几种属性的获取和设置就无能为力了。

在用findfirst()findnext()函数去查找磁盘文件时经常使用的一个数据结构WIN32_FIND_DATA的成员变量里包含了以上所有的文件属性,因此可以通过这个结构作为获取和更改文件属性的手段。该结构的内容如下:

typedef struct _WIN32_FIND_DATA {DWORD dwFileAttributes;FILETIME ftCreationTime;FILETIME ftLastAccessTime;FILETIME ftLastWriteTime;DWORD nFileSizeHigh;DWORD nFileSizeLow;DWORD dwReserved0;DWORD dwReserved1;_Field_z_ CHAR   cFileName[ MAX_PATH ];_Field_z_ CHAR   cAlternateFileName[ 14 ];
#ifdef _MACDWORD dwFileType;DWORD dwCreatorType;WORD  wFinderFlags;
#endif
} WIN32_FIND_DATAA, *PWIN32_FIND_DATAA, *LPWIN32_FIND_DATAA;
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格式文件名}

注意:在使用这个结构时不能手工修改这个结构中的任何数据,结构对于开发人员来说只能作为一个只读数据,其所有的成员变量都会由系统完成填写。在MSDN帮助中可以查找到关于WIN32_FIND_DATA结构的更加详细的说明

可以通过FindFirstFile()函数根据当前的文件存放路径查找该文件来把待操作文件的相关属性读取到WIN32_FIND_DATA结构中

FindFirstFile

函数功能

根据文件名查找文件。该函数到一个文件夹(包括子文件夹)去搜索指定文件 如果要使用附加属性去搜索文件的话 可以使用FindFirstFileEx函数。

函数声明

HANDLE FindFirstFile(_In_ LPCSTR lpFileName,_Out_ LPWIN32_FIND_DATAA lpFindFileData);

第一个参数

输入参数lpFileNameString,欲搜索的文件名。参数可如下(注!一定要带文件名。如果参数为“c:\Windows”,则返回的文件名为“Windows”,并且接下来调用FindNextFile会返回失败)

第二个参数

输出参数_WIN32_FIND_DATA,这个结构用于装载与找到的文件有关的信息。该结构可用于后续的搜索

结构说明
dwFileAttributes字段可以是下面取值的组合,通过这个字段可以检查找到的究竟是一个文件还是一个子目录,以及其他的文件属性
(返回的文件名中会包含".“和”. ."。“.'代表本目录,". ."代表上一层目录。一般情况下需要把这两个名称过滤掉。比如要进行文件删除操作)

返回值(搜索句柄)

Long,如执行成功,返回一个搜索句柄,可以作为一个参数用于FindNextFile函数。如果出错,返回一个INVALID_HANDLE_VALUE常数,一旦不再需要,应该用FindClose函数关闭这个句柄

FindNextFile

函数功能

顾名思义,用于搜索下一个文件,当不存在下一个文件,即搜索完毕后,返回false;

函数声明

BOOL WINAPI FindNextFile(_In_   HANDLE hFindFile,_Out_  LPWIN32_FIND_DATA lpFindFileData
);

第一个参数

输入参数,hFindFile 上一次FindFirstFileFindNextFile得到的HANDLE

第二个参数

输出参数,lpFindFileData 用于保存搜索得到的文件信息,也就是我们上方说过的_WIN32_FIND_DATA结构体
lpFindFileData用于获取文件信息。通常,最初的两次搜索得到的文件名为:"." 、". .",分别代表当前目录和上级目录。写代码时需要注意。上面已经提示。

返回值(BOOL)

它的返回值可不是HANDLE类型哦,而是BOOL,顾名思义,也就是能找到下一个文件,则返回TRUE,不能则返回FALSE

实现代码:

#include<Windows.h>
#include <iostream>
using namespace std;DWORD   EnumerateFileInDirectory(LPTSTR szPath)
{WIN32_FIND_DATA  FindFileData;HANDLE hListFile;TCHAR szFilePath[MAX_PATH];lstrcpy(szFilePath, szPath);lstrcat(szFilePath, (LPCSTR)"\\\\*");hListFile = FindFirstFile(szFilePath, &FindFileData);if (hListFile == INVALID_HANDLE_VALUE) {printf("%s", GetLastError());return 1;}else {do {if (lstrcmp(FindFileData.cFileName, ".") == 0 || lstrcmp(FindFileData.cFileName, "..") == 0) {continue;}printf("%s\t\t", FindFileData.cFileName);if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_ENCRYPTED){printf("加密文件\t");}if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN){printf("隐藏文件\t");}if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){printf("DIR\t");}printf("\n");} while (FindNextFile(hListFile,&FindFileData));}return 0;
}
int main()
{EnumerateFileInDirectory((LPTSTR)"F:\\\\");
}

注意点:

a.我这里面用了 \ \ \ \因为有两个在字符串里是转义,然后的话就不得不写出四个,因为\\代表路径下一级嘛
b._WIN32_FIND_DATA结构里面的属性值其实根据是二进制位的设置,要通过按位与从而来查看相应的属性

FindFirstFile FindNextFile 以及_WIN32_FIND_DATA结构相关推荐

  1. 使用FindFirstFile,FindNextFile遍历一个文件夹

    //遍历文件夹函数void TraverseFolder(LPCTSTR lpPath){TCHAR szFind[MAX_PATH] = {_T("\0")};WIN32_FIN ...

  2. C#使用WIN32API来高效率的遍历文件和目录(转)

    我们有时需要遍历某个目录下的文件和子目录,可以使用System.IO.DirectoryInfo.GetDirectories或 GetFiles来获得目录下的所有的文件和子目录,当这个目录下的内容比 ...

  3. qt获取窗口的右上角位置_如何获得 Qt窗口部件在主窗口中的位置--确定鼠标是否在某一控件上与在控件上的位置...

    用Qt Creator 设计程序时,最方便的就是ui设计器,可以很容易的得到想要的布局. 但是这样自动布局带来的后果是很难知道窗口中某一部件在主窗口中的相对位置. 在处理子窗口鼠标事件时变的很麻烦.主 ...

  4. 如何使用C或C ++获取目录中的文件列表?

    如何从C或C ++代码内部确定目录中的文件列表? 我不允许执行ls命令并从程序中解析结果. #1楼 GNU手册FTW http://www.gnu.org/software/libc/manual/h ...

  5. WinCE文件目录定制及内存调整

    这个说起来比较简单,WinCE的文件目录结构以及文件的位置都是在DAT文件中定义的.所有的dat文件会在WinCE编译时合并成initobj.dat文件,WinCE会根据DAT中的描述生成相应目录. ...

  6. 如何写一个简单的病毒程序

    引:前些天学病毒这门技术着实吃了很多苦头,走了很多弯路,尽管按我的知识水平,病毒已经是水到渠成的学习内容了.但是我现在学了入门才发现这门技术实际 上隐藏着很多玄机,包含着许多技术,不专门学习研究根本无 ...

  7. 经典笔试面试题总结(一)

    1.文件长度是一个大于0的整数,用变量unsignedfile_length; 来表示,把文件分成块,每块的长度也是一个大于0的整数,用变量unsigned block_length; 来表示,则文件 ...

  8. Win 32API速查

    文章目录 Win32API 用户篇 内核篇 **常见的动态链接库文件** 恶意软件常用API 常用windows函数 参数表 WinExec VirtualAllocEx CreateProcess ...

  9. GIT 存储格式与运用

    为什么80%的码农都做不了架构师?>>>    GIT 存储格式与运用 在 GIT 的实现规范中,存储格式是非常简单而且高效的,一个代码托管平台通常需要 基于这些特性实现一非常有意思 ...

最新文章

  1. awk内建变量示例详解之NR、FNR、NF
  2. php的异常详解,PHP5中的异常处理详解
  3. js字符串与数组的处理
  4. 计算机操作系统原理精品课程,计算机操作系统原理.ppt
  5. leetcode - 46. 全排列(对vector容器的元素进行搜索,判断是否存在vector中)
  6. h5物体拖动_html5实现拖拽效果
  7. 贺利坚老师汇编课程21笔记:用汇编语言写的源程序
  8. 如何学习财务数据分析,有哪些好工具?
  9. 宝峰c1对讲机写频软件_宝峰对讲机写频软件
  10. 3dmax打开错误html,Windows安装3dmax软件失败提示错误三种解决办法
  11. 题解-牛客网-SQL-SQL(SQL21)查找所有员工自入职以来的薪水涨幅情况
  12. 马云鼓动年轻人2015创业是存私心的?
  13. python 证件照换背景色(蓝底->白底,蓝底->红底)
  14. 水处理设备网关,生活污水处理设备网关。
  15. 使用OpenOffice插件实现RTF/WORD转PDF转多张图片或者一张图片
  16. linux解压zip、bz、bz2、z、gz、tar(解包)
  17. 去掉UUID的小横线,如果你觉得不爽的话,哈哈
  18. 数据库SQL语句 快速入门(一)
  19. NR常用协议以及下载路径
  20. C语言实验03_判断语句

热门文章

  1. AGI:走向通用人工智能的【生命学哲学科学】第二篇——思维、生命科学、客观世界
  2. 成功解决 AttributeError: module ‘keras.engine.topology‘ has no attribute ‘load_weights_from_hdf5_group_b
  3. 成功解决SyntaxError: encoding problem: utf8 with BOM
  4. AI开发者大会:2020年7月3日09:50--10:10唐杰《人工智能的下一个十年》
  5. CV之YOLOv3:深度学习之计算机视觉神经网络Yolov3-5clessses训练自己的数据集全程记录(第二次)
  6. ASP.NET的Page.IsPostBack 属性详细说明(转)
  7. POJ_2104 K-th Number 【主席树】
  8. TensorFlowIO操作(一)----线程和队列
  9. [ZJOI 2010]count 数字计数
  10. jQuery插件 -- Cookie插件