代码之家  ›  专栏  ›  技术社区  ›  pbreault

在Java中:获取目录的快照并还原它

  •  4
  • pbreault  · 技术社区  · 15 年前

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

    编辑 : 基本上,我正在处理一个非常大的文件夹:80MB,大约7000个文件。 我只想尽快恢复修改过的文件。 只是把所有的东西都复制回去看起来很费时。

    6 回复  |  直到 15 年前
        1
  •  2
  •   Yishai    15 年前

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

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

    至于实际的递归副本,Apache有一个 method 因为在下议院IO,还有一个要做的 recursive delete .

        2
  •  2
  •   Bryan Denny    15 年前

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

    Take a look at java.io.File

    And here is another library specifically for copying files/folders.

    编辑:你必须找到一些方法来跟踪或“标记”修改过的文件。可以用这样的“标志”属性扩展文件类吗?您可以将所有文件保存在内存中,但是如果这些目录太大,那么您就必须担心内存不足。

        3
  •  0
  •   Martin K.    15 年前

    是啊!有足够的API功能来完成这项工作!

    是否要拍摄递归快照?

    我非常喜欢groovy语法:

    currentDir.eachFileRecurse{ file ->
    ...}
    
        4
  •  0
  •   LB40    15 年前

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

        5
  •  0
  •   Zed    15 年前

    不完全是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) {
          ...
        }
    }
    
        6
  •  0
  •   elhoim    15 年前

    观察目录(和子目录)中的更改,累积更改,然后当您想要反转更改时,只复制更改的文件。

    例如,请参见:

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

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