2012-03-15 63 views
6

我目前正在創建一個備份應用程序,我們需要一種方法來讀取其他應用程序正在使用的文件,同時我們也希望儘量減少我們在用戶文件上產生的鎖定。使用Window的卷影複製服務似乎是我們實現這一目標的完美方式。使用Java的卷影複製

但是,我們的問題是我們正在使用Java。無論如何,我們是否有任何簡單的方法來實現它(使用一些庫或者甚至可能使用一些CLI)?

+1

這只是一個意見,但你要做的是爲「本地」語言,如C++的工作。連接到Java的操作系統API是一個巨大的麻煩,而且速度很慢。 – Jochen 2012-03-15 21:39:12

+1

[JNI is'nt slow](http://stackoverflow.com/a/7809300/351861) - 如果它確實適合你......好吧......你的代碼中很可能存在主要的編程錯誤。它也沒有「* hassle」*爲JNI **編寫本地庫,但是它相當......不方便 - 如果您從未寫過C/C++,那麼您很可能會學到很多東西,並且需要考慮一些事情但這只是它 - 這也是[JNA](https://en.wikipedia.org/wiki/Java_Native_Access),這使得它更容易和更少的*「麻煩」* – specializt 2017-01-19 09:56:21

回答

2

所以,我不太瞭解VSS,但是從Java訪問Windows本機API方面,我會檢查出JNA。您可能會發現有人已經將相關API定義移植到JNA。

+1

JNA定義的任何指針? – CAFxX 2012-12-03 10:52:06

1

嗯......通過Java這樣做可能會非常棘手,非常容易出錯

一個簡單的方法做到這一點是寫一個小本機DLL這是你想要使用VSS VSS的API

做什麼然後使用C#pInvoke或C++/CLI ...然後您可以使用任何其他CLI兼容語言

7

我之前完成了此操作。

,我們發現最簡單的方法是建立了4個版本的vshadow.exe(演示工具,從微軟網站上的快速啓動與VSS):一個用於XP /後和x86/x64操作系統中的每個目標者平臺。 vshadow的基本上允許創建或銷燬快照和檢索路徑是這樣的:即與JAVA文件API工作

\\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopyXX,你可以用它來取代你的驅動器盤符(D:例如)。 VSS SDK的VShadow版本是可讀寫的,與您可以直接下載的只有只讀的exe版本不同。

然後,在Java中,使用統一接口(用於處理XP和更高版本之間的VShadow的兩種不同行爲)編寫兩個CLI封裝器很容易。

祝你好運。