Detecting if a directory is a junction in Delphi

I've been Google searching this I may be having some brain clouds because it just isn't working.

I need to detect if a folder is a junction so my recursive file search doesn't run off into an endless loop.

I could use a simple function like

IsJunction(attr: dword): boolean; 

where attr is dwFileAttributes from TWin32FindData;

I just can't seem to get it to work. Thanks!

3

2 Answers

dwFileAttributes of TWin32FindData does not have that information, you have to look to the dwReserved0 field. See documentation.

function IsJunction(const FileName: string): Boolean;
// IO_REPARSE_TAG_MOUNT_POINT = $A0000003;
var FindHandle: THandle; FindData: TWin32FindData;
begin Result := False; FindHandle := FindFirstFile(PChar(FileName), FindData); if FindHandle <> INVALID_HANDLE_VALUE then begin Result := (Bool(FindData.dwFileAttributes and FILE_ATTRIBUTE_REPARSE_POINT)) and Bool(FindData.dwReserved0 and $80000000) // MS bit and Bool(FindData.dwReserved0 and $20000000) // name surrogate bit and (LoWord(FindData.dwReserved0) = 3); // mount point value winapi.windows.FindClose(FindHandle); end else RaiseLastOSError;
end;
10

You can try also JCL (JEDI Code Library) JclNTFS unit.
it has a few methods to deal with junctions e.g:
NtfsIsFolderMountPoint / NtfsGetJunctionPointDestination.

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

You Might Also Like