读书人

遍历当前目录获取文件信息调试过程中

发布时间: 2013-01-25 15:55:30 作者: rapoo

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

//根据当前目录获取本地的文件和目录信息

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的关系,可以组合多种属性
[解决办法]

#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



虽然delphi 的基本定义数值是2的n次方。但是
这个记录型变量返回的结果是多个值逻辑位或出来的结果

所以楼主你在比较的时候,不能单独去用等于。
因为你只需要判断其中的一个位就可以了。不管其他的。
就用delphi的and就可以了。

读书人网 >.NET

热点推荐