遍历当前目录获取资料信息,调试过程中发现dwFileAttributes出现各种奇怪的值
遍历当前目录获取文件信息,调试过程中发现dwFileAttributes出现各种奇怪的值
------解决方案--------------------
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
//根据当前目录获取本地的文件和目录信息 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