注:本文讨论的是怎么用Windows API遍历目录下的所有文件。除Windows API,还有一种Windows/Linux通用的方式,使用<io.h>。
WIN32_FIND_DATA结构
遍历目录下的文件需要用到WIN32_FIND_DATA结构。实际上有两种结构:WIN32_FIND_DATAA和WIN32_FIND_DATAW。A和W分别代表ASCII和宽字符(Unicode)。定义UNICODE宏时,WIN32_FIND_DATA指WIN32_FIND_DATAW;否则指WIN32_FIND_DATAA。
下面是两个结构的定义(minwinbase.h,VS2015):
typedef struct _WIN32_FIND_DATAA { 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 _MAC DWORD dwFileType; DWORD dwCreatorType; WORD wFinderFlags; #endif } WIN32_FIND_DATAA; typedef struct _WIN32_FIND_DATAW { DWORD dwFileAttributes; FILETIME ftCreationTime; FILETIME ftLastAccessTime; FILETIME ftLastWriteTime; DWORD nFileSizeHigh; DWORD nFileSizeLow; DWORD dwReserved0; DWORD dwReserved1; _Field_z_ WCHAR cFileName[ MAX_PATH ]; _Field_z_ WCHAR cAlternateFileName[ 14 ]; #ifdef _MAC DWORD dwFileType; DWORD dwCreatorType; WORD wFinderFlags; #endif } WIN32_FIND_DATAW;
关于_MAC宏的部分可以忽略, 这是有历史原因的——曾今Microsoft是Mac的最大开发者,为了方便Windows上的应用移植到Mac上,就使用_MAC宏,如果是Mac操作系统_MAC就是有定义的。(根据Stack Overflow)因为这里说的是Windows,就先把这个放一边。
下面是每个结构成员的含义:
dwFileAttributes
一个文件的文件属性。
文件属性常量:
FILE_ATTRIBUTE_ARCHIVE(0x20):文件或目录是档案文件或目录。应用程序使用这种属性标记文件,表示备份或移除。
FILE_ATTRIBUTE_COMPRESSED(0x800):文件或目录是压缩的。对于一个文件,其中的所有数据都是压缩的。对于一个目录,对于新创建的文件和子目录默认压缩。
FILE_ATTRIBUTE_DIRECTORY(0x40):这个值保留给系统使用。
FILE_ATTRIBUTE_DIRECTORY(0x10):标记一个目录的句柄。
FILE_ATTRIBUTE_ENCRYPTED(0x10):文件或目录是加密的。对于一个文件,所有的数据流都被加密了。对于一个目录,对于新创建的文件和子目录默认加密。
FILE_ATTRIBUTE_HIDDEN(0x2):文件或目录是隐藏的。遍历文件夹时一般不考虑它们。
FILE_ATTRIBUTE_INTEGRITY_STREAM(0x8000):
(TO BE CONTINUED, DO NOT REPRODUCE)