加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 00:27:41 所属栏目:Java 来源:网络整理
导读:我一直在寻找一个方法来确定一个文件是否是一个连接点,并没有找到任何令人满意的答案. 我尝试的第一件事是: Files.isSymbolicLink(aPath) 它只检测符号链接,而不是在Windows中称为连接的文件. 还尝试了这里提出的解决方案(使用JNA库): Stackoverflow quest
我一直在寻找一个方法来确定一个文件是否是一个连接点,并没有找到任何令人满意的答案.

我尝试的第一件事是:

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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读