首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

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

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

遍历当前目录获取文件信息,调试过程中发现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;  endend;//如果是代码问题,请问大家,怎么修改。//或者大家有自己的实现的好方法


[解决办法]
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 

热点排行