使用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
吗?