检测目录是否是Delphi中的联结

Dan*_*iel 16 delphi junction

我一直在谷歌搜索这个我可能有一些脑云,因为它不起作用.

我需要检测文件夹是否是一个联结,所以我的递归文件搜索不会运行到无限循环.

我可以使用像这样的简单函数

IsJunction(attr: dword): boolean; 
Run Code Online (Sandbox Code Playgroud)

其中attr dwFileAttributes来自TWin32FindData;

我似乎无法让它工作.谢谢!

Ser*_*yuz 12

dwFileAttributesTWin32FindData并没有这些信息,你必须寻找到的dwReserved0领域.见文档.

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;
Run Code Online (Sandbox Code Playgroud)

  • 确实.当您尝试调试问题时,请不要选择复杂的测试环境.选择最简单的环境.简单地调用`IsJunction`.它给出了正确的答案吗?如果是,请将其添加到您的程序中.如果你的程序失败了,你就会知道你的程序而不是`IsJunction`. (2认同)

kob*_*bik 7

您也可以尝试JCL(JEDI代码库)JclNTFS单元.
它有一些处理结点的方法,例如:
NtfsIsFolderMountPoint/ NtfsGetJunctionPointDestination.