我一直在寻找一个方法来确定一个文件是否是一个连接点,并没有找到任何令人满意的答案.
我尝试的第一件事是:
Files.isSymbolicLink(aPath)
还尝试了这里提出的解决方案(使用JNA库):
Stackoverflow question (3249117)
,但是我从来没有对任何我认为是路口的文件恢复正确.
我发现确定哪些文件是连接点的唯一方法是在Windows命令提示符下运行以下命令:
DIR /S /A:L
在我的电脑上,它返回66个文件夹,文件Files.isSymbolicLink(aPath)只返回2.
所以我想我可以找到一种方法来利用这一点,但是我不认为在遍历一个文件树时效率会很高.
有没有办法使用标准的java库,或替代JNA?
解决方法
如果您可以在JNA中编写本地代码,则可以直接调用Win32 API GetFileAttributes()函数,并检查FILE_ATTRIBUTE_REPARSE_POINT标志(连接是否实现为重分析点).
更新:为了区分不同类型的重分析点,您必须对实际重分析点的ReparseTag进行检索.对于连接点,它将被设置为IO_REPARSE_TAG_MOUNT_POINT(0xA0000003).
有两种方式来检索ReparseTag:
>使用DeviceIoControl()
与FSCTL_GET_REPARSE_POINT
控制代码获得一个REPARSE_DATA_BUFFER
结构,它作为一个ReparseTag字段.您可以在以下文章中看到使用此技术的IsDirectoryJunction()实现示例:
NTFS Hard Links,Directory Junctions,and Windows Shortcuts
>使用FindFirstFile()
获取一个WIN32_FIND_DATA
结构.如果路径具有FILE_ATTRIBUTE_REPARSE_POINT属性,dwReserved0字段将包含ReparseTag.