//根据当前目录获取本地的文件和目录信息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;//如果是代码问题,请问大家,怎么修改。
//或者大家有自己的实现的好方法

解决方案 »

  1.   

    dwFileAttributes  为什么不能出现22呢, 你是不是没有理解集合的概念, 当你的文档有多个属性的时候就会出现22了, 22 换算成2进制表示是(0001 0011), 表示的是它有3个属性, 2,4,16, 举个例子文件可以同时是隐含的, 系统的.
      

  2.   

    if gFindData.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY 也不是这么判断的, 应该是
    if (gFindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) <> 0 then
      

  3.   

    #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就可以了。