繁体   English   中英

在java中:获取目录的快照并将其还原

[英]In java: Take snapshot of a directory and restore it

是否有一个库可以获取文件夹,获取其内容的快照,进行一些修改,然后直接从java程序(即不是从命令行)将其恢复到以前的状态?

编辑 :基本上,我正在处理一个非常大的文件夹:80mb,~7000个文件。 我想只恢复尽快修改的文件。 只复制一切看起来很费时间。

我不知道你想要什么的非标准库,但你可以尝试将目录的内容复制到一个临时目录中,并在完成后将其复制回来(并删除临时目录)。

看看java.io.File

这是另一个专门用于复制文件/文件夹的库。

要进行编辑:您必须找到一些方法来跟踪或“标记”已修改的文件。 也许用这样的“flag”属性扩展文件类? 您可以将所有文件保存在内存中,但如果这些目录变得太大,您将不得不担心内存不足。

快照基本上是所有目录的递归副本,这似乎是不可避免的。 在恢复方面,只需删除目录并使用原始名称重命名临时目录。

如果这是用于功能测试,那么如何拥有一个已知的好目录并在测试开始时复制它? 这样就没有快照了。 当然,这只适用于您始终使用一组已知文件的情况。

至于实际的递归副本,Apache在Commons-IO中有一个方法 ,以及一个进行递归删除的方法

是啊! 有足够的API功能来做到这一点!

你想拍一个递归快照吗?

我很喜欢groovy语法:

currentDir.eachFileRecurse{ file ->
...}

不完全是Java,但不那么令人头痛......

public void before(String origDir, String tmpDir) {
    try {
      Runtime.getRuntime().exec("cp -pr " + origDir + " " + tmpDir).waitFor();
    } catch (IOException err) {
      ...
    }
}


public void after(String origDir, String tmpDir) {
    try {
      String rndDir = createRandomName();
      Runtime.getRuntime().exec("mv " + origDir + " " + rndDir).waitFor();
      Runtime.getRuntime().exec("mv " + tmpDir + " " + origDir).waitFor();
      Runtime.getRuntime().exec("rm " + rndDir);
    } catch (IOException err) {
      ...
    }
}

我来看看apache-commons IO库 我特别使用DirectoryWalker,它非常方便地递归检查目录的内容。

查看目录(和子目录)以进行更改,累积它们,然后在要反转更改时,仅复制更改的文件。

参见例如:

http://twit88.com/blog/2007/10/02/develop-a-java-file-watcher/

http://www2.hawaii.edu/~qzhang/FileSystemWatcher/index.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM