java – 确定一个文件是否是一个连接(在Windows中)?

前端之家收集整理的这篇文章主要介绍了java – 确定一个文件是否是一个连接(在Windows中)?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我一直在寻找一个方法来确定一个文件是否是一个连接点,并没有找到任何令人满意的答案.

我尝试的第一件事是:

Files.isSymbolicLink(aPath)

它只检测符号链接,而不是在Windows中称为连接的文件.

还尝试了这里提出的解决方案(使用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.

猜你在找的Java相关文章