Volume Shadow Copy с использованием Java - PullRequest
6 голосов
/ 16 марта 2012

В настоящее время я создаю приложение для резервного копирования, в котором нам нужен способ чтения файлов, используемых другими приложениями, и мы также хотим минимизировать блокировку, которую мы берем на файлы пользователей. Использование службы теневого копирования томов в Windows кажется нам идеальным способом для достижения этой цели.

Однако наша проблема в том, что мы используем Java. Есть ли какой-нибудь легкий способ для нас реализовать это в любом случае (либо с помощью некоторой библиотеки или, возможно, даже с некоторым CLI)?

Ответы [ 3 ]

7 голосов
/ 10 октября 2012

Я делал это раньше.

Самый простой способ, который мы обнаружили, - это создать 4 версии vshadow.exe (демонстрационный инструмент для быстрого запуска с VSS с веб-сайта Microsoft): по одной для каждой целевой платформы в XP / более поздней и x86 / x64. VShadow в основном позволяет создавать или уничтожать снимок и извлекать путь, который выглядит следующим образом:

\\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopyXX, который можно использовать для замены буквы вашего диска (например, D:), которая работает с API файлов JAVA . Версия VShadow из VSS SDK предназначена для чтения и записи, это не та же версия, что и исполняемый файл, который вы можете загрузить напрямую, только для чтения.

Затем в Java легко написать две оболочки CLI с унифицированным интерфейсом (для обработки двух разных поведений VShadow между XP и более поздними версиями).

Удачи.

2 голосов
/ 16 марта 2012

Итак, я не очень разбираюсь в VSS, но с точки зрения доступа к собственным API-интерфейсам Windows из Java, я бы ознакомился с JNA.Вы можете обнаружить, что кто-то уже перенес соответствующие определения API в JNA.

1 голос
/ 16 марта 2012

Хм ... делать это через Java может быть сложно и очень подвержено ошибкам

Один простой способ сделать это - написать небольшую встроенную DLL, которая делает то, что вы хотите, чтобы VSS делал с использованием VSS API

И затем используя C # pInvoke или C ++ / CLI ... и затем вы можете использовать любой другой язык, совместимый с CLI

...