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-commonsIOライブラリを見てみましょう。私は特に、ディレクトリのコンテンツを再帰的に検査するのに非常に便利な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 に答える