使用VSS,我创建了一个卷快照,可以成功地访问其上的文件:java.nio.file.Path误差与VSS(卷影复制)路径
C:\> type \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Users\Eric\Desktop\test.txt
test text 1/2
test text 2/2
当我尝试访问从java使用java.io.File
相同的文件,它工作正常。但是我无法通过调用toPath
像这样将它转换成一个java.nio.file.Path
:
File file = newFile(vssPath)
Path path = file.toPath()
这样做在异常跟踪结果。这是一个的OpenJDK和known issue我得到相同的结果与Java 91年8月1日:
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
不触犯解析器限制的运行?
我认为艾伦说,删除前缀可能*在Java *中工作。它肯定不会从命令行工作。 (这个想法似乎是Java在调用Windows API时会自动放回前缀,尽管我不太明白它是如何判断这是正确的做法。) –
也许java会在需要时正确添加前缀因为路径的长度大于MAX_PATH?这是有道理的,但当然无助于与VSS合作。 – Eric
我认为,但是链接票上的OP表示它解决了他们的问题,而他们似乎没有处理漫长的路径。很难确定。 –