Hallo alle miteinander,
da meine aktuelle Backup-Festplatte inzwischen fast überläuft und Backups der letzten 10 Jahre beinhaltet wollte ich mir ein Programm schreiben, mit welchem ich die komplette Festplatte analysieren und Datei-Duplikate identifizieren kann.
Um dies zu bewerkstelligen durchlaufe ich die gesamte Festplatte rekursiv, bilde über jede Datei einen SHA-256-Hash und speichere diesen zunächst in einer MySQL-Datenbank.
Insgesamt funktionierte das Ganze bei Testläufen schon vielversprechend, aber wenn ich es nun auf meine Festplatte loslasse schmiert mir das Ganze nach einiger Zeit mit obiger Meldung weg. Dazu muss ich sagen, dass ich bereits eine Überprüfung eingebaut habe welche anhand des Absolut- und Canonical-Path entscheidet, ob ein symbolischer Link vorliegt oder nicht und falls ja diesen übergeht.
Insgesamt sieht die letzte Exception (bevor mir das Ganze dann auch noch wegen einer OutOfMemoryError um die Ohren fliegt) so aus:
Code in Zeile 60 (beinhaltet die Prüf-Methode für symbolische Links):
Code in Zeile 111:
Code in Zeile 110:
Code in Zeile 107:
Code in Zeile 51:
Man sieht also recht gut, dass das Ganze scheinbar wirklich ekelig tief verschachtelt ist (was daran liegt, dass einfach ganze Profile und Home-Verzeichnisse gesichert wurden). Allerdings verstehe ich nun nicht, warum genau an der Stelle das Ganze mir dann um die Ohren fliegt, und ich habe auch irgendwie keine Lösung dazu finden können.
Dass das Ganze am Ende noch mit einer OOME wegfliegt ist eine andere Geschichte, denn die obige Exception tritt viel früher auf, das Programm fängt diese jedoch ab und läuft erstmal weiter, so dass ich mir auch vorstellen kann, dass die OOME behoben sein könnte, wenn die vorherigen Exceptions behoben sind.
Gruß & Danke,
Trench
da meine aktuelle Backup-Festplatte inzwischen fast überläuft und Backups der letzten 10 Jahre beinhaltet wollte ich mir ein Programm schreiben, mit welchem ich die komplette Festplatte analysieren und Datei-Duplikate identifizieren kann.
Um dies zu bewerkstelligen durchlaufe ich die gesamte Festplatte rekursiv, bilde über jede Datei einen SHA-256-Hash und speichere diesen zunächst in einer MySQL-Datenbank.
Insgesamt funktionierte das Ganze bei Testläufen schon vielversprechend, aber wenn ich es nun auf meine Festplatte loslasse schmiert mir das Ganze nach einiger Zeit mit obiger Meldung weg. Dazu muss ich sagen, dass ich bereits eine Überprüfung eingebaut habe welche anhand des Absolut- und Canonical-Path entscheidet, ob ein symbolischer Link vorliegt oder nicht und falls ja diesen übergeht.
Insgesamt sieht die letzte Exception (bevor mir das Ganze dann auch noch wegen einer OutOfMemoryError um die Ohren fliegt) so aus:
Code:
java.io.IOException: Too many levels of symbolic links
at java.io.UnixFileSystem.canonicalize0(Native Method)
at java.io.UnixFileSystem.canonicalize(UnixFileSystem.java:159)
at java.io.File.getCanonicalPath(File.java:559)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.isLink(DuplicateFileFinder.java:60)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:111)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:110)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.getDirectoryContent(DuplicateFileFinder.java:107)
at de.assassinator.duplicatefilefinder.DuplicateFileFinder.main(DuplicateFileFinder.java:51)
04.11.2009 21:05:49 de.assassinator.duplicatefilefinder.DuplicateFileFinder getDirectoryContent
Code in Zeile 60 (beinhaltet die Prüf-Methode für symbolische Links):
Code:
String canonicalName = file.getCanonicalPath();
Code in Zeile 111:
Code:
logger.info("Analyzing file "+childFile.getName());
Code in Zeile 110:
Code:
if(!isLink(childFile)) {
Code in Zeile 107:
Code:
getDirectoryContent(childFile.getAbsolutePath());
Code in Zeile 51:
Code:
getDirectoryContent(startDirectory);
Man sieht also recht gut, dass das Ganze scheinbar wirklich ekelig tief verschachtelt ist (was daran liegt, dass einfach ganze Profile und Home-Verzeichnisse gesichert wurden). Allerdings verstehe ich nun nicht, warum genau an der Stelle das Ganze mir dann um die Ohren fliegt, und ich habe auch irgendwie keine Lösung dazu finden können.
Dass das Ganze am Ende noch mit einer OOME wegfliegt ist eine andere Geschichte, denn die obige Exception tritt viel früher auf, das Programm fängt diese jedoch ab und läuft erstmal weiter, so dass ich mir auch vorstellen kann, dass die OOME behoben sein könnte, wenn die vorherigen Exceptions behoben sind.
Gruß & Danke,
Trench
Zuletzt bearbeitet: