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!
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;