delphi junction

Detectar si un directorio es un cruce en Delphi



junction (2)

He estado buscando en Google, puedo estar teniendo algunas nubes cerebrales porque simplemente no funciona.

Necesito detectar si una carpeta es una unión para que mi búsqueda recursiva de archivos no se convierta en un bucle sin fin.

Podría usar una función simple como

IsJunction(attr: dword): boolean;

donde attr es dwFileAttributes from TWin32FindData;

Parece que no puedo hacerlo funcionar. ¡Gracias!


También puede probar la unidad JclNTFS JCL (Biblioteca de códigos JEDI).
Tiene algunos métodos para tratar las uniones, por ejemplo:
NtfsIsFolderMountPoint / NtfsGetJunctionPointDestination .


dwFileAttributes of TWin32FindData no tiene esa información, debe buscar el campo dwReserved0 . Ver 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;