В Java: сделать снимок каталога и восстановить его - PullRequest
4 голосов
/ 19 августа 2009

Есть ли библиотека, чтобы взять папку, сделать снимок ее содержимого, сделать некоторые изменения и затем восстановить ее в прежнее состояние непосредственно из Java-программы (т.е. не из командной строки)?

Редактировать : В основном я работаю с очень большой папкой: 80 МБ, ~ 7000 файлов. И я хочу восстановить только те файлы, которые были изменены как можно быстрее. Только копирование всего назад требует много времени.

Ответы [ 6 ]

2 голосов
/ 20 августа 2009

Снимок - это в основном рекурсивная копия всех каталогов, и это кажется неизбежным. Что касается восстановления, просто удалите каталог и переименуйте временный каталог с исходным именем.

Если это для функционального тестирования, как насчет наличия хорошо известного каталога и его копирования в начале теста? Таким образом, снимок не делается. Конечно, это работает, только если вы всегда начинаете с известного набора файлов.

Что касается фактической рекурсивной копии, то в Apache есть метод для этого в Commons-IO, а также метод для рекурсивного удаления .

2 голосов
/ 19 августа 2009

Я не знаю нестандартной библиотеки для того, что вы хотите, но вы можете попробовать скопировать содержимое каталога во временный каталог и скопировать его обратно, когда закончите (и удалить временный каталог).

Взгляните на java.io.File

А вот еще одна библиотека специально для копирования файлов / папок.

К вашему редактированию: вам нужно будет найти способ отслеживать или помечать файлы, которые были изменены. Может быть, расширить класс файла с таким свойством "флаг"? Вы можете хранить все файлы в памяти, но тогда вам придется беспокоиться о нехватке памяти, если эти каталоги когда-нибудь станут слишком большими.

0 голосов
/ 21 октября 2009

Просмотр каталога (и подкаталогов) на предмет изменений, их накапливание, а затем, когда вы хотите отменить изменения, только скопируйте измененные файлы.

См. Например:

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

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

0 голосов
/ 19 августа 2009

Я бы взглянул на библиотеку apache-commons IO . В частности, я использовал DirectoryWalker, который действительно удобен для рекурсивной проверки содержимого каталога.

0 голосов
/ 19 августа 2009

Не совсем 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) {
      ...
    }
}
0 голосов
/ 19 августа 2009

Да! Для этого достаточно API-функций!

Хотите сделать рекурсивный снимок?

Мне очень нравится отличный синтаксис:

currentDir.eachFileRecurse{ file ->
...}
...