与VSS(卷影复制)路径的java.nio.file.Path错误

时间:2016-12-01 22:14:16

标签: java windows unc volume-shadow-service

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

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

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

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

这样做会导致异常跟踪。这是OpenJDK的known issue,我得到了与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)

由于我无法获得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吗?

0 个答案:

没有答案