Browse Source

* ignore sfn in findfirst win7+ mantis #35742. Entangled with symlink support

git-svn-id: trunk@42286 -
marco 6 years ago
parent
commit
c914655a67
1 changed files with 13 additions and 3 deletions
  1. 13 3
      rtl/win/sysutils.pp

+ 13 - 3
rtl/win/sysutils.pp

@@ -92,6 +92,10 @@ implementation
     sysconst,
     sysconst,
     windirs;
     windirs;
 
 
+var 
+  FindExInfoDefaults : TFINDEX_INFO_LEVELS = FindExInfoBasic;
+  FindFirstAdditionalFlags : DWord = 0;
+
 function WinCheck(res:boolean):boolean;
 function WinCheck(res:boolean):boolean;
   begin
   begin
     if not res then
     if not res then
@@ -468,7 +472,7 @@ begin
             end;
             end;
           end;
           end;
 
 
-          Handle := FindFirstFileExW(PUnicodeChar(FileName), FindExInfoBasic, @SymLinkRec.FindData,
+          Handle := FindFirstFileExW(PUnicodeChar(FileName), FindExInfoDefaults , @SymLinkRec.FindData,
                       FindExSearchNameMatch, Nil, 0);
                       FindExSearchNameMatch, Nil, 0);
           if Handle <> INVALID_HANDLE_VALUE then begin
           if Handle <> INVALID_HANDLE_VALUE then begin
             Windows.FindClose(Handle);
             Windows.FindClose(Handle);
@@ -498,7 +502,7 @@ const
     Handle: THandle;
     Handle: THandle;
   begin
   begin
     { FindFirstFileEx is faster than FindFirstFile }
     { FindFirstFileEx is faster than FindFirstFile }
-    Handle := FindFirstFileExW(PUnicodeChar(FileOrDirName), FindExInfoBasic, @FindData,
+    Handle := FindFirstFileExW(PUnicodeChar(FileOrDirName), FindExInfoDefaults , @FindData,
                 FindExSearchNameMatch, Nil, 0);
                 FindExSearchNameMatch, Nil, 0);
     Result := Handle <> INVALID_HANDLE_VALUE;
     Result := Handle <> INVALID_HANDLE_VALUE;
     if Result then begin
     if Result then begin
@@ -587,7 +591,9 @@ begin
   Rslt.ExcludeAttr:=(not Attr) and ($1e);
   Rslt.ExcludeAttr:=(not Attr) and ($1e);
                  { $1e = faHidden or faSysFile or faVolumeID or faDirectory }
                  { $1e = faHidden or faSysFile or faVolumeID or faDirectory }
   { FindFirstFile is a Win32 Call }
   { FindFirstFile is a Win32 Call }
-  Rslt.FindHandle:=FindFirstFileW (PWideChar(Path),Rslt.FindData);
+  Rslt.FindHandle:=FindFirstFileExW(PUnicodeChar(Path), FindExInfoDefaults , @Rslt.FindData,
+                      FindExSearchNameMatch, Nil, FindFirstAdditionalFlags);
+
   If Rslt.FindHandle=Invalid_Handle_value then
   If Rslt.FindHandle=Invalid_Handle_value then
    begin
    begin
      Result:=GetLastError;
      Result:=GetLastError;
@@ -1386,6 +1392,10 @@ begin
   kernel32dll:=GetModuleHandle('kernel32');
   kernel32dll:=GetModuleHandle('kernel32');
   if kernel32dll<>0 then
   if kernel32dll<>0 then
     GetDiskFreeSpaceEx:=TGetDiskFreeSpaceEx(GetProcAddress(kernel32dll,'GetDiskFreeSpaceExA'));
     GetDiskFreeSpaceEx:=TGetDiskFreeSpaceEx(GetProcAddress(kernel32dll,'GetDiskFreeSpaceExA'));
+  if Win32MajorVersion<6 then
+     FindExInfoDefaults := FindExInfoStandard; // also searches SFNs. XP only.
+  if (Win32MajorVersion>=6) and (Win32MinorVersion>=1) then 
+    FindFirstAdditionalFlags := FIND_FIRST_EX_LARGE_FETCH; // win7 and 2008R2+
 end;
 end;
 
 
 Function GetAppConfigDir(Global : Boolean) : String;
 Function GetAppConfigDir(Global : Boolean) : String;