Hi alle zusammen,
ich habe ein Problem in meinem aktuellen Nebenprojekt.
Ich schreibe momentan ein kleines Programm, das die Daten (hauptsächlich Bilder) meines Fileservers mit meinem heimischen PC syncronisiert. Dafür wird in einem einstellbaren Zeitabstand der Server nach neuen Dateien durchsucht und diese ggf. heruntergeladen. Die Verbindung zwischen Server und Client ist mittels FTP realisiert.
Ich habe diese Methode geschrieben, um alle Dateien auf dem Server ausfindig zu machen:
Kurze Erklärung um euch einen besseren Überblick zu verschaffen:
In Zeile 2 werden alle Dateien des aktuellen verzeichnisses aufgelistet (zu behinn natürlich das root verzeichnis).
Danach wird geprüft ob es sich um einen Ordner oder eine Datei handelt. Ist es ein Order wird der Pfad in die HashMap eingetragen und eine neue ArrayList für die Dateinamen angelegt, in zeile 4 geöffnet und mittels Rekursion durchsucht, anschließend wird der ordner wieder verlassen und die Suche im Oberverzeichnis fortgesetzt.
Ist es eine Datei wird geprüft ob diese schon lokal vorhanden ist. Log.isFileAlreadyLoaded(String path) prüft ob die Datei bereits heruntergeladen wurde. Falls nicht wird der Dateiname zur Dateiliste des aktuellen Verzeichnisses hinzugefügt um sie später herunter zu laden.
Das ganze funktioniert im Großen und ganzen wie es soll, allerdings bleibt das Programm direkt beim Methodenaufruf stehen (Zeile 2). Allerdings auch das nicht gleich beim ersten Aufruf. Die Methode ist ja rekursiv und bleibt erst nach mehreren Aufrufen stehen. Dabei lässt sich kein konkretes Muster erkennen.
Einen StackOverflow kann ich ausschließen, da die Ordnerstruktur nicht so tief geht. OutOfMemory wäre zwar möglich (immerhin speicher ich jede neuen Dateinamen mit dem zugehörigen Pfad in einer HashMap<String, ArrayList<String>> wobei der key den Pfad und die ArrayList die vorhandenen Dateien darstellt, allerdings bekomme ich keine Exception.
Ist es möglich, dass im oben gezeigten Code ein 'ß' in einem Dateinamen bzw. einem Dateipfad Probleme macht? Ich habe den Code mehrere Male durchlaufen lassen und es bleibt öfter bei einem Pfad mit 'ß' stehen als an anderen Stellen, teilweise aber auch an stellen wo sich im Pfad keine Umlaute befinden.
Kann es sein, dass die zwischengespeicherte Datenmenge zu groß ist? Es müssen am Anfang, da noch keine Dateien auf dem PC vorhanden sind ca. 15000 Dateien heruntergeladen werden. Die Namen dieser Dateien landen wie bereits erwähnt in einer ArrayList welche als Value in einer HashMap stehen.
Ich hoffe mir kann geholfen werden, ich probiere schon seit einigen Tagen das Programm zum laufen zu bringen und bin mittlerweile mit meinem Latein am Ende.
Gruß twinflyer
ich habe ein Problem in meinem aktuellen Nebenprojekt.
Ich schreibe momentan ein kleines Programm, das die Daten (hauptsächlich Bilder) meines Fileservers mit meinem heimischen PC syncronisiert. Dafür wird in einem einstellbaren Zeitabstand der Server nach neuen Dateien durchsucht und diese ggf. heruntergeladen. Die Verbindung zwischen Server und Client ist mittels FTP realisiert.
Ich habe diese Methode geschrieben, um alle Dateien auf dem Server ausfindig zu machen:
Java:
public static void checkForNewFiles() throws IOException {
for (FTPFile file : client.listFiles()) {
if (file.isDirectory()) {
client.changeWorkingDirectory(file.getName());
pathsToNewFiles.put(client.printWorkingDirectory(),
new ArrayList<String>());
checkForNewFiles();
client.changeToParentDirectory();
} else {
if (!Log.isFileAlreadyLoaded(client
.printWorkingDirectory() + "/" + file.getName())) {
pathsToNewFiles.get(client.printWorkingDirectory()).add(
file.getName());
}
}
}
}
Kurze Erklärung um euch einen besseren Überblick zu verschaffen:
In Zeile 2 werden alle Dateien des aktuellen verzeichnisses aufgelistet (zu behinn natürlich das root verzeichnis).
Danach wird geprüft ob es sich um einen Ordner oder eine Datei handelt. Ist es ein Order wird der Pfad in die HashMap eingetragen und eine neue ArrayList für die Dateinamen angelegt, in zeile 4 geöffnet und mittels Rekursion durchsucht, anschließend wird der ordner wieder verlassen und die Suche im Oberverzeichnis fortgesetzt.
Ist es eine Datei wird geprüft ob diese schon lokal vorhanden ist. Log.isFileAlreadyLoaded(String path) prüft ob die Datei bereits heruntergeladen wurde. Falls nicht wird der Dateiname zur Dateiliste des aktuellen Verzeichnisses hinzugefügt um sie später herunter zu laden.
Das ganze funktioniert im Großen und ganzen wie es soll, allerdings bleibt das Programm direkt beim Methodenaufruf stehen (Zeile 2). Allerdings auch das nicht gleich beim ersten Aufruf. Die Methode ist ja rekursiv und bleibt erst nach mehreren Aufrufen stehen. Dabei lässt sich kein konkretes Muster erkennen.
Einen StackOverflow kann ich ausschließen, da die Ordnerstruktur nicht so tief geht. OutOfMemory wäre zwar möglich (immerhin speicher ich jede neuen Dateinamen mit dem zugehörigen Pfad in einer HashMap<String, ArrayList<String>> wobei der key den Pfad und die ArrayList die vorhandenen Dateien darstellt, allerdings bekomme ich keine Exception.
Ist es möglich, dass im oben gezeigten Code ein 'ß' in einem Dateinamen bzw. einem Dateipfad Probleme macht? Ich habe den Code mehrere Male durchlaufen lassen und es bleibt öfter bei einem Pfad mit 'ß' stehen als an anderen Stellen, teilweise aber auch an stellen wo sich im Pfad keine Umlaute befinden.
Kann es sein, dass die zwischengespeicherte Datenmenge zu groß ist? Es müssen am Anfang, da noch keine Dateien auf dem PC vorhanden sind ca. 15000 Dateien heruntergeladen werden. Die Namen dieser Dateien landen wie bereits erwähnt in einer ArrayList welche als Value in einer HashMap stehen.
Ich hoffe mir kann geholfen werden, ich probiere schon seit einigen Tagen das Programm zum laufen zu bringen und bin mittlerweile mit meinem Latein am Ende.
Gruß twinflyer