使用 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
不违反解析器限制的方法?