2016-12-01 1 views
1

VSS verwenden, ich habe einen Volume Snapshot erstellt und kann erfolgreich auf Dateien zugreifen darauf:java.nio.file.Path Fehler mit VSS (Volume Shadow Copy) Pfaden

C:\> type \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Users\Eric\Desktop\test.txt 
test text 1/2 
test text 2/2 

Wenn ich versuche, die für den Zugriff auf gleiche Datei von Java mit java.io.File funktioniert es gut. Allerdings bin ich nicht in der Lage, es zu einem java.nio.file.Path zu konvertieren, indem toPath wie folgt aufrufen:

File file = newFile(vssPath) 
Path path = file.toPath() 

Doing so ergibt sich eine Ausnahme Spur. Dies ist ein known issue für OpenJDK ist und ich bekomme das gleiche Ergebnis mit 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) 

Da ich keine Path gibt es bestimmte APIs bekommen kann ich nicht in der Lage bin zu verwenden, zum Beispiel java.nio.channels.AsynchronousFileChannel die nur mit einem Path instanziiert werden.

Gibt es eine alternative Syntax für den Zugriff auf die Schattenkopiedatei, die nicht mit dieser JDK-Einschränkung in Konflikt gerät? Das oben verlinkte OpenJDK-Ticket empfiehlt, einfach das lange UNC-Präfix (\\?) wegzulassen, aber ich habe keine Variation gefunden, die legal zu sein scheint. Für das Beispiel all scheitert folgende:

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 

Wenn es keine Variante Weg ist kann ich toPath() nennen, dann ist es eine andere Möglichkeit, ich erwerben konnte java.nio.file.Path, die nicht in Konflikt mit dem Parser Einschränkung läuft?

+0

Ich denke, dass Alan sagt, dass das Löschen des Präfixes * in Java * funktionieren könnte. Es wird sicherlich nicht von der Kommandozeile aus funktionieren. (Die Idee scheint zu sein, dass Java das Präfix beim Aufruf der Windows-API automatisch zurücksetzt. Obwohl ich nicht ganz verstehe, wie es sagen kann, wenn das richtig ist.) –

+0

Vielleicht fügt Java das Präfix bei Bedarf korrekt hinzu weil die Länge des Pfades größer als MAX_PATH ist? Das wäre sinnvoll, hilft aber natürlich nicht bei der Arbeit mit VSS. – Eric

+0

Ich dachte darüber nach, aber das OP auf dem verknüpften Ticket sagte, dass es ihr Problem gelöst habe, und sie schienen nicht mit langen Wegen zu tun zu haben. Allerdings ist das nicht sicher. –

Antwort

0

In Ermangelung eines fristgerechten Problems zu umgehen, mein Team diskutiert:

  1. unsere eigene Implementierung von java.nio.file.Path erstellen (oder einen in einer anderen Bibliothek finden)
  2. Änderungscode die Verwendung von java.nio.file.Path
  3. zu vermeiden

... und wir entschieden uns für # 2. # 1 wäre eine allgemeinere Problemumgehung sollte wahrscheinlich die akzeptierte Antwort sein, wenn jemand es tut und teilt.