是否有一个库可以获取文件夹,获取其内容的快照,进行一些修改,然后直接从java程序(即不是从命令行)将其恢复到以前的状态?
修改的: 基本上,我正在处理一个非常大的文件夹:80mb,~7000个文件。 我想只恢复尽快修改的文件。 只复制一切看起来很费时间。
答案 0 :(得分:2)
我不知道你想要什么的非标准库,但你可以尝试将目录的内容复制到一个临时目录中,并在完成后将其复制回来(并删除临时目录)。
And here is another library specifically for copying files/folders.
要进行编辑:您必须找到一些方法来跟踪或“标记”已修改的文件。也许用这样的“flag”属性扩展文件类?您可以将所有文件保存在内存中,但如果这些目录变得太大,您将不得不担心内存不足。
答案 1 :(得分:2)
快照基本上是所有目录的递归副本,这似乎是不可避免的。在恢复方面,只需删除目录并使用原始名称重命名临时目录。
如果这是用于功能测试,那么如何拥有一个已知的好目录并在测试开始时复制它?这样就没有快照了。当然,只有始终使用一组已知文件才能起作用。
对于实际的递归副本,Apache在Commons-IO中有一个method,还有一个用于recursive delete。
答案 2 :(得分:0)
呀!有足够的API功能来做到这一点!
您想拍摄递归快照吗?
我非常喜欢groovy语法:
currentDir.eachFileRecurse{ file ->
...}
答案 3 :(得分: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) {
...
}
}
答案 4 :(得分:0)
我会看一下apache-commons IO library。我特别使用了DirectoryWalker,它非常方便地递归检查目录的内容。
答案 5 :(得分:0)
观察目录(和子目录)的更改,累积它们,然后当您想要撤消更改时,只复制更改的文件。
参见例如:
http://twit88.com/blog/2007/10/02/develop-a-java-file-watcher/