4

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

编辑:基本上,我正在处理一个非常大的文件夹:80mb,~7000 个文件。而且我只想尽快恢复修改过的文件。仅将所有内容复制回来看起来很耗时。

4

6 回答 6

2

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

看看 java.io.File

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

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

于 2009-08-19T19:16:36.553 回答
2

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

如果这是用于功能测试,那么有一个已知的好目录并在测试开始时复制它怎么样?这样就没有快照了。当然,这只有在您总是从一组已知的文件开始时才有效。

至于实际的递归复制,Apache 在 Commons-IO 中有一个方法,还有一个进行递归删除的方法。

于 2009-08-19T20:28:58.887 回答
0

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

您要拍摄递归快照吗?

我非常喜欢 groovy 语法:

currentDir.eachFileRecurse{ file ->
...}
于 2009-08-19T19:18:01.150 回答
0

不完全是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) {
      ...
    }
}
于 2009-08-19T19:28:33.003 回答
0

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

于 2009-08-19T19:35:51.787 回答
0

观察目录(和子目录)的变化,积累它们,然后当你想撤销变化时,只复制变化的文件。

参见例如:

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

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

于 2009-10-21T13:28:34.113 回答