Parcourir la source

* Delphi raises a EDirectoryNotFoundException if the link's target does not exist, so do the same

git-svn-id: trunk@43110 -
svenbarth il y a 6 ans
Parent
commit
3dbbb18649
1 fichiers modifiés avec 13 ajouts et 5 suppressions
  1. 13 5
      rtl/win/sysutils.pp

+ 13 - 5
rtl/win/sysutils.pp

@@ -411,7 +411,7 @@ begin
 end;
 
 
-function FileGetSymLinkTarget(const FileName: UnicodeString; out SymLinkRec: TUnicodeSymLinkRec): Boolean;
+function FileGetSymLinkTargetInt(const FileName: UnicodeString; out SymLinkRec: TUnicodeSymLinkRec; RaiseErrorOnMissing: Boolean): Boolean;
 { reparse point specific declarations from Windows headers }
 const
   IO_REPARSE_TAG_MOUNT_POINT = $A0000003;
@@ -478,7 +478,9 @@ begin
             Windows.FindClose(Handle);
             SymLinkRec.Attr := SymLinkRec.FindData.dwFileAttributes;
             SymLinkRec.Size := QWord(SymLinkRec.FindData.nFileSizeHigh) shl 32 + QWord(SymLinkRec.FindData.nFileSizeLow);
-          end else
+          end else if RaiseErrorOnMissing then
+            raise EDirectoryNotFoundException.Create(SysErrorMessage(GetLastOSError))
+          else
             SymLinkRec.TargetName := '';
         end else
           SetLastError(ERROR_REPARSE_TAG_INVALID);
@@ -492,6 +494,12 @@ begin
 end;
 
 
+function FileGetSymLinkTarget(const FileName: UnicodeString; out SymLinkRec: TUnicodeSymLinkRec): Boolean;
+begin
+  Result := FileGetSymLinkTargetInt(FileName, SymLinkRec, True);
+end;
+
+
 function FileOrDirExists(const FileOrDirName: UnicodeString; CheckDir: Boolean; FollowLink: Boolean): Boolean;
 const
   CDirAttributes: array[Boolean] of DWORD = (0, FILE_ATTRIBUTE_DIRECTORY);
@@ -513,10 +521,10 @@ const
 
   function LinkFileExists: Boolean;
   var
-    LinkTargetName: UnicodeString;
+    slr: TUnicodeSymLinkRec;
   begin
-    Result := FileGetSymLinkTarget(FileOrDirName, LinkTargetName) and
-                FileOrDirExists(LinkTargetName, CheckDir, False);
+    Result := FileGetSymLinkTargetInt(FileOrDirName, slr, False) and
+                FileOrDirExists(slr.TargetName, CheckDir, False);
   end;
 
 const