使用Java的卷影复制

使用Java的卷影复制,java,windows,locking,volume-shadow-service,Java,Windows,Locking,Volume Shadow Service,我目前正在创建一个备份应用程序,我们需要一种读取其他应用程序正在使用的文件的方法,我们还希望最大限度地减少对用户文件的锁定。使用Window的卷影复制服务似乎是实现这一目标的完美方式 然而,我们的问题是我们正在使用Java。有没有什么简单的方法可以实现这一点(或者使用一些库,或者甚至可能使用一些CLI)?因此,我对VSS了解不多,但就从Java访问Windows本机API而言,我会查看JNA。您可能会发现有人已经将相关的API定义移植到JNA。嗯。。。通过Java实现这一点可能很棘手,而且非常容

我目前正在创建一个备份应用程序,我们需要一种读取其他应用程序正在使用的文件的方法,我们还希望最大限度地减少对用户文件的锁定。使用Window的卷影复制服务似乎是实现这一目标的完美方式


然而,我们的问题是我们正在使用Java。有没有什么简单的方法可以实现这一点(或者使用一些库,或者甚至可能使用一些CLI)?

因此,我对VSS了解不多,但就从Java访问Windows本机API而言,我会查看JNA。您可能会发现有人已经将相关的API定义移植到JNA。

嗯。。。通过Java实现这一点可能很棘手,而且非常容易出错

一种简单的方法是编写一个小型的本机DLL,它可以完成您希望VSS使用VSS API执行的操作

然后使用C#pInvoke或C++/CLI。。。然后,您可以使用任何其他符合CLI的语言

我以前做过这件事

我们发现的最简单的方法是构建4个版本的vshadow.exe(用于从Microsoft网站快速启动VSS的演示工具):一个用于XP/later和x86/x64中的每个目标平台。 VShadow基本上允许创建或销毁快照并检索如下路径:

\\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopyXX
,可用于替换与JAVA文件API一起使用的驱动器号(
D:
)。 VSS SDK中的VShadow版本是读写的,这与您可以直接下载的exe版本不同,后者是只读的

然后,在Java中,很容易编写两个具有统一接口的CLI包装器(用于处理XP和更高版本之间VShadow的两种不同行为)


<>祝你好运。

这只是一个观点,但是你要做的是一个“母语”的工作,比如C++。从Java连接到OS API是一件非常麻烦的事情,而且速度非常慢。-如果真的是为了你。。。好。。。您的代码中很可能存在严重的编程错误。为JNI编写本机库也不是一件“麻烦事”,但它相当。。。。不方便——如果你从来没有写过C/C++,你很可能会有很多东西要学,还有一些事情要考虑,但正是如此——这也使得它变得更容易,而不是“麻烦”。