dwFileAttributes

场景:遍历当前目录获取资料信息,调试过程中发现dwFileAttributes出现各种奇怪的值

遍历当前目录获取文件信息,调试过程中发现dwFileAttributes出现各种奇怪的值
Delphi(Pascal) code
//根据当前目录获取本地的文件和目录信息

procedure GetChildFilesInfo(pPath: PAnsiChar);
var
  FirstHandle: THandle;
  InvalidHandleNo: Integer;
  FIleCount:Integer;
  DirCount:Integer;
  IsExist: LongBool;
begin
  InvalidHandleNo := 0;
  FirstHandle := 0;
  StrCat(pPath, '*');
  ZeroMemory(@gFindData, SizeOf(WIN32_FIND_DATA));
  begin
    FirstHandle := FindFirstFile(pPath, gFindData);
    if FirstHandle = INVALID_HANDLE_VALUE then
       showmessage('无效句柄')
    else
    begin
        //同下
      if gFindData.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY then
      //如果是目录,记录
      begin
        StrLCopy(PChar(@DataFilesResult[i].DataFilePath), PChar(@gFindData.cFileName), MAX_PATH);
        Inc(DirCount);
      end
      else
      //如果是文件,详细记录
      begin
        StrLCopy(PChar(@DataFilesResult[i].DataFilePath), PChar(@gFindData.cFileName), MAX_PATH);
        Inc(FileCount);
      end
    end;
    while True do
    begin
      IsExist := FindNextFile(FirstHandle, gFindData);
      if IsExist = False then
        Break
      else
      begin
        begin
//注意此处,gFindData.dwFileAttributes的值,出现过16,22,32。
//据windows下的定义,不会出现22才对。只能是2的n此方。。一直郁闷
//求高人帮忙,或者大家看代码那块不对。
          if gFindData.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY then
      //如果是目录,记录
          begin
            StrLCopy(PChar(@DataFilesResult[i].DataFilePath), PChar(@gFindData.cFileName), MAX_PATH);
            Inc(DirCount);
          end
          else
      //如果是文件,记录
          begin
            StrLCopy(PChar(@DataFilesResult[i].DataFilePath), PChar(@gFindData.cFileName), MAX_PATH);
            Inc(FileCount);
          end
        end;
      end
    end;
  end
end;

//如果是代码问题,请问大家,怎么修改。
//或者大家有自己的实现的好方法


------解决方案--------------------
dwFileAttributes 为什么不能出现22呢, 你是不是没有理解集合的概念, 当你的文档有多个属性的时候就会出现22了, 22 换算成2进制表示是(0001 0011), 表示的是它有3个属性, 2,4,16, 举个例子文件可以同时是隐含的, 系统的.
------解决方案--------------------
if gFindData.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY 也不是这么判断的, 应该是
if (gFindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) <> 0 then


------解决方案--------------------
他们是or的关系,可以组合多种属性
------解决方案--------------------
Delphi(Pascal) code
#define FILE_SHARE_READ                 0x00000001  
#define FILE_SHARE_WRITE                0x00000002  
#define FILE_SHARE_DELETE               0x00000004  
#define FILE_ATTRIBUTE_READONLY             0x00000001  
#define FILE_ATTRIBUTE_HIDDEN               0x00000002  
#define FILE_ATTRIBUTE_SYSTEM               0x00000004  
#define FILE_ATTRIBUTE_DIRECTORY            0x00000010  
#define FILE_ATTRIBUTE_ARCHIVE              0x00000020  
#define FILE_ATTRIBUTE_ENCRYPTED            0x00000040  
#define FILE_ATTRIBUTE_NORMAL               0x00000080  
#define FILE_ATTRIBUTE_TEMPORARY            0x00000100  
#define FILE_ATTRIBUTE_SPARSE_FILE          0x00000200  
#define FILE_ATTRIBUTE_REPARSE_POINT        0x00000400  
#define FILE_ATTRIBUTE_COMPRESSED           0x00000800  
#define FILE_ATTRIBUTE_OFFLINE              0x00001000  
#define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED  0x00002000  
#define FILE_NOTIFY_CHANGE_FILE_NAME    0x00000001   
#define FILE_NOTIFY_CHANGE_DIR_NAME     0x00000002   
#define FILE_NOTIFY_CHANGE_ATTRIBUTES   0x00000004   
#define FILE_NOTIFY_CHANGE_SIZE         0x00000008   
#define FILE_NOTIFY_CHANGE_LAST_WRITE   0x00000010   
#define FILE_NOTIFY_CHANGE_LAST_ACCESS  0x00000020   
#define FILE_NOTIFY_CHANGE_CREATION     0x00000040   
#define FILE_NOTIFY_CHANGE_SECURITY     0x00000100   
#define FILE_ACTION_ADDED                   0x00000001   
#define FILE_ACTION_REMOVED                 0x00000002   
#define FILE_ACTION_MODIFIED                0x00000003   
#define FILE_ACTION_RENAMED_OLD_NAME        0x00000004   
#define FILE_ACTION_RENAMED_NEW_NAME        0x00000005   
#define MAILSLOT_NO_MESSAGE             ((DWORD)-1) 
#define MAILSLOT_WAIT_FOREVER           ((DWORD)-1) 
#define FILE_CASE_SENSITIVE_SEARCH      0x00000001  
#define FILE_CASE_PRESERVED_NAMES       0x00000002  
#define FILE_UNICODE_ON_DISK            0x00000004  
#define FILE_PERSISTENT_ACLS            0x00000008  
#define FILE_FILE_COMPRESSION           0x00000010  
#define FILE_VOLUME_QUOTAS              0x00000020  
#define FILE_SUPPORTS_SPARSE_FILES      0x00000040  
#define FILE_SUPPORTS_REPARSE_POINTS    0x00000080  
#define FILE_SUPPORTS_REMOTE_STORAGE    0x00000100  
#define FILE_VOLUME_IS_COMPRESSED       0x00008000  
#define FILE_SUPPORTS_OBJECT_IDS        0x00010000  
#define FILE_SUPPORTS_ENCRYPTION        0x00020000