Используя 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)
Поскольку я не могу получить Path
, есть определенные API, которые я не могу использовать, например java.nio.channels.AsynchronousFileChannel
, которые можно создать только с Path
.
Есть ли какой-либо альтернативный синтаксис для доступа к файлу теневой копии, который не противоречит этому ограничению JDK? В упомянутом выше билете OpenJDK рекомендуется просто опустить префикс long-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
, который не противоречит ограничениям парсера?