1

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

4

1 に答える 1

0

タイムリーな回避策がないため、私のチームは次のことについて話し合いました。

  1. 独自の実装を作成しますjava.nio.file.Path(または他のライブラリで見つけます)
  2. の使用を避けるようにコードを変更するjava.nio.file.Path

...そして、#2 に落ち着きました。#1は、より一般的な回避策であり、誰かがそれを行って共有した場合、おそらく受け入れられる答えになるはずです。

于 2016-12-02T17:39:15.957 に答える