2016-12-01 25 views
1

使用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不触犯解析器限制的运行?

+0

我认为艾伦说,删除前缀可能*在Java *中工作。它肯定不会从命令行工作。 (这个想法似乎是Java在调用Windows API时会自动放回前缀,尽管我不太明白它是如何判断这是正确的做法。) –

+0

也许java会在需要时正确添加前缀因为路径的长度大于MAX_PATH?这是有道理的,但当然无助于与VSS合作。 – Eric

+0

我认为,但是链接票上的OP表示它解决了他们的问题,而他们似乎没有处理漫长的路径。很难确定。 –

回答

0

在没有及时的解决办法,我的团队讨论:

  1. 创造我们自己的执行java.nio.file.Path(或找到一个在其他一些库)
  2. 改变代码,以避免使用java.nio.file.Path

...我们在#2上定居。 #1将是一个更普遍的解决方法应该可能是被接受的答案,如果有人曾经这样做,并分享。