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
でしかインスタンス化できない API があります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