Velvet Star Monitor

Standout celebrity highlights with iconic style.

general

Detecting if a directory is a junction in Delphi

Writer Mia Lopez

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.