2009-08-19 21 views
4

Gibt es eine Bibliothek, um einen Ordner zu nehmen, einen Schnappschuss seines Inhalts zu machen, einige Änderungen vorzunehmen und ihn dann direkt von einem Java-Programm wiederherzustellen (dh nicht von der Befehlszeile)?In Java: Machen Sie einen Snapshot eines Verzeichnisses und stellen Sie es wieder her

Bearbeiten: Grundsätzlich arbeite ich an einem sehr großen Ordner: 80 MB, ~ 7000 Dateien. Und ich möchte nur Dateien wiederherstellen, die so schnell wie möglich geändert wurden. Nur alles zurückkopieren sieht zeitaufwendig aus.

+0

Können Sie mehr Details darüber, wie geben diese Dateien geändert werden können? Ist es möglich, dass jemand nur die Datei berührt? Ist es möglich, dass jemand ein Byte ersetzt, aber das Dateidatum auf den ursprünglichen Wert zurücksetzt? – Zed

+0

Grundsätzlich werden vorhandene Dateien geändert, neue Dateien hinzugefügt und andere entfernt. Dies wird verwendet, um Funktionstests bei einem Installationsvorgang durchzuführen. – pbreault

Antwort

2

Der Snapshot ist im Grunde eine rekursive Kopie durch alle Verzeichnisse, und das scheint unvermeidlich. Zum Wiederherstellen einfach das Verzeichnis löschen und das temporäre Verzeichnis mit dem ursprünglichen Namen umbenennen.

Wenn dies für Funktionstests ist, wie wäre es mit einem bekannten guten Verzeichnis und kopieren Sie es zu Beginn des Tests? Auf diese Weise gibt es keine Momentaufnahme. Das funktioniert natürlich nur, wenn Sie immer mit einer bekannten Datei beginnen.

Wie für die tatsächliche rekursive Kopie hat Apache eine method dafür in Commons-IO, sowie eine recursive delete zu tun.

2

Ich weiß nicht, eine nicht-standard-Bibliothek für was Sie wollen, aber Sie könnten versuchen, den Inhalt des Verzeichnisses in ein temporäres Verzeichnis kopieren und kopieren Sie es zurück, wenn Sie fertig sind (und löschen Sie das temporäre Verzeichnis) .

Take a look at java.io.File

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

Um Ihre edit: Sie werden einen Weg finden müssen, um den Überblick über oder „Flag“ Dateien zu halten, die geändert wurden. Vielleicht erweitern Sie die Dateiklasse mit einer solchen "Flag" -Eigenschaft? Sie können alle Dateien im Speicher behalten, aber dann müssen Sie sich sorgen, dass Ihnen nicht genügend Arbeitsspeicher zur Verfügung steht, wenn diese Verzeichnisse jemals zu groß werden.

0

Yeah! Dafür gibt es genügend API-Funktionalität!

Möchten Sie einen rekursiven Snapshot erstellen?

Ich mag die groovy Syntax viel:

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

Nicht gerade Java, aber gibt weniger Kopfschmerzen ...

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

ich einen Blick auf die apache-commons IO library nehmen würde. Ich habe vor allem den DirectoryWalker benutzt, der sehr praktisch ist, um den Inhalt eines Verzeichnisses rekursiv zu inspizieren.