1

使用 VSS,我创建了一个卷快照,并且可以成功访问其中的文件:

C:\> type \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Users\Eric\Desktop\test.txt
test text 1/2
test text 2/2

当我尝试从 java 访问相同的文件时,java.io.File它工作正常。但是我无法通过这样java.nio.file.Path的调用将其转换为toPath

File file = newFile(vssPath)
Path path = file.toPath()

这样做会导致异常跟踪。这是 OpenJDK 的一个已知问题,我使用 java 1.8.91 得到了相同的结果:

STACKTRACE:: java.nio.file.InvalidPathException: Illegal character [?] in path at index 2: \\?    \GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Users\qa\Desktop\lock_full.txt
    at sun.nio.fs.WindowsPathParser.nextSlash(Unknown Source)
    at sun.nio.fs.WindowsPathParser.parse(Unknown Source)
    at sun.nio.fs.WindowsPathParser.parse(Unknown Source)
    at sun.nio.fs.WindowsPath.parse(Unknown Source)
    at sun.nio.fs.WindowsFileSystem.getPath(Unknown Source)
    at java.io.File.toPath(Unknown Source)

由于我无法获得 a Path,因此我无法使用某些 API,例如java.nio.channels.AsynchronousFileChannel只能使用Path.

是否有任何替代语法来访问不会违反此 JDK 限制的卷影副本文件?上面链接的 OpenJDK 票证建议仅省略长 UNC 前缀 ( \\?),但我没有发现任何似乎合法的变体。例如以下所有失败:

    C:\> type \\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Users\Eric\Desktop\test.txt
    C:\> type \\Device\HarddiskVolumeShadowCopy1\Users\Eric\Desktop\test.txt
    C:\> type \\HarddiskVolumeShadowCopy1\Users\Eric\Desktop\test.txt

如果没有我可以用来调用的变体路径,toPath()那么是否有其他方法可以获得java.nio.file.Path不违反解析器限制的方法?

4

1 回答 1

0

在没有及时解决的情况下,我的团队讨论了:

  1. 创建我们自己的实现java.nio.file.Path(或在其他库中找到一个)
  2. 更改代码以避免使用java.nio.file.Path

...我们选择了#2。#1将是一个更通用的解决方法,如果有人做过并分享,它可能应该是公认的答案。

于 2016-12-02T17:39:15.957 回答