Java: Ordner auf Aenderungen ueberwachen

Dieses Thema im Forum "Java/Mono/dotGNU" wurde erstellt von Greenleon, 05.01.2010.

  1. #1 Greenleon, 05.01.2010
    Greenleon

    Greenleon Tripel-As

    Dabei seit:
    08.01.2007
    Beiträge:
    184
    Zustimmungen:
    0
    Taag,

    Ein Java-Programm ueberwacht einen Ordner auf Aenderungen, indem der entsprechende Thread sich alle paar Sekunden den Ordnerinhalt auflisteten laesst.
    Alle neuen Dateien werden dann zur weiteren Verarbeitung geladen.

    Das Problem dabei ist folgendes: Wenn sich eine Datei noch im Kopiervorgang befindet, ist sie in der Liste enthalten. Wenn ich sie dann aber ins Programm lade habe ich eine unvollstaendige Datei und unvorhersehbares Verhalten tritt auf.

    Gibt es irgendwelche eleganten Methoden, das zu verhindern?

    Die einzige Loesung, die mir einfaellt, ist, die Dateien immer auf ihre Groesse zu ueberpruefen und sie dann erst zu laden, wenn zwei aufeinanderfolgende Pruefdurchlaeufe die gleiche Groesse fuer eine Datei ermitteln.
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 HPollak, 06.01.2010
    HPollak

    HPollak Foren As

    Dabei seit:
    21.12.2007
    Beiträge:
    93
    Zustimmungen:
    0
    Schau dir mal die JavaDoc zu java.io.File an. Da gibts die Methode
    vielleicht hilft dir ja das weiter.
     
  4. #3 sim4000, 06.01.2010
    sim4000

    sim4000 Lebende Foren Legende

    Dabei seit:
    12.04.2006
    Beiträge:
    1.933
    Zustimmungen:
    0
    Ort:
    In meinem Zimmer
    Kann man eventuell die Prozessliste (ps aux) fetchen und dort gucken ob mit der Datei gerade was gemacht wird?
    »lsof« gibt es auch noch.

    Wie man das allerdings in Java Aufrufen kann (vorhandene Klassen?) weiß ich allerdings nicht.
     
  5. #4 marcellus, 06.01.2010
    marcellus

    marcellus Kaiser

    Dabei seit:
    09.05.2007
    Beiträge:
    1.392
    Zustimmungen:
    0
    Vllt hast gibts ja eine java bibliothek, die mit inotify kann. Alternativ kannst du das java programm erst mit incron starten.
     
  6. #5 saeckereier, 06.01.2010
    saeckereier

    saeckereier Graue Eminenz

    Dabei seit:
    08.05.2005
    Beiträge:
    1.920
    Zustimmungen:
    0
    Ort:
    Im schönen Norden
    Wie wäre es, wenn du die Dateien beim reinkopieren erst mal datei.part nennst, so wie z.B. der Firefox das tut. Wenn die Kopie dann beendet ist einfach umbennen und im Programm .part ignorieren. Das mit der Größe wäre evtl. auch ein Ansatz ist aber m.E. nicht so sauber.. Erzähl mal bitte ein bisschen mehr über den Hintergrund..
     
  7. #6 Greenleon, 06.01.2010
    Zuletzt bearbeitet: 06.01.2010
    Greenleon

    Greenleon Tripel-As

    Dabei seit:
    08.01.2007
    Beiträge:
    184
    Zustimmungen:
    0
    saeckereier: nicht so gut... das Programm ist nicht fuer mich... sollte moeglichst einfach sein.
    Das Programm laedt Dateien verschiedener Formate und zeigt sie als "Diashow" an. Bei mehrseitigen UTF-8/ASCII Dateien scrollt der Text. Wird nacher fuer einen Info-Monitor genutzt. Bislang lassen sich die Dateien aber nur "per Hand" laden, d.h. man gibt den Pfad zu einer Datei, einem Ordner voller Dateien an und die werden geladen. Beim naechsten Schritt, stosse ich eben auf das im Anfangspost genannte Problem.

    sim4000: dann ist es nicht mehr plattformunabhaengig.. leider auch nicht so gut

    marcellus: gute Idee. Hab das hier gefunden http://jnotify.sourceforge.net/. Schau ich mir mal genauer an

    HPollak: Wenn das funktionieren sollte, waer das sogar die beste Loesung, da es ohne nativen Code auskommt. Das probier ich als erstes mal. Ich hab nur die Befuerchtung, dass der Wert einfach angibt, wann der Schreibprozess begonnen hat. Bei grossen Dateien hilft das dann gar nicht.
     
  8. #7 saeckereier, 06.01.2010
    saeckereier

    saeckereier Graue Eminenz

    Dabei seit:
    08.05.2005
    Beiträge:
    1.920
    Zustimmungen:
    0
    Ort:
    Im schönen Norden
    Inotify sollte eher nicht helfen. Schliesslich gibt es kein Event "Kopieren beendet" Wie sollte es auch. Wäre aber interessant um nicht immer das komplette Verzeichnis zu pollen. Ist eben die Frage wie viele Dateien da rein kommen sollen..
     
  9. #8 Greenleon, 06.01.2010
    Greenleon

    Greenleon Tripel-As

    Dabei seit:
    08.01.2007
    Beiträge:
    184
    Zustimmungen:
    0
    Hm, mist. Ich schaetze auf 30 Dateien im Extremfall...
    Dann werd ich wohl doch immer das ganze Verzeichnis ueberpruefen, bevor ich mir noch mehr nativen Code ans Bein haenge.

    Weiss jemand, wie sich der lastModified Wert unter Windows verhaelt? Wann wird der gesetzt? Wie ist es unter linux?
     
  10. #9 marcellus, 06.01.2010
    marcellus

    marcellus Kaiser

    Dabei seit:
    09.05.2007
    Beiträge:
    1.392
    Zustimmungen:
    0
    Ist vielleicht eine dumme Frage, aber wie verhält sich eine zum schreiben geöffnete datei, wenn du sie zum schreiben öffnen willst?

    Wegen inotify würds ja auch reichen, dass du bei einer neuen datei zyklisch das modified signal abfängst und wartest, bis es nicht mehr kommt.
     
  11. #10 Greenleon, 06.01.2010
    Greenleon

    Greenleon Tripel-As

    Dabei seit:
    08.01.2007
    Beiträge:
    184
    Zustimmungen:
    0
    Ist glaub ich Plattformabhaengig.

    Fuer inotify muesste ich halt diese jnotify lib nehmen. Ist unschoen, da das zum groessten Teil nativer Code ist.
     
  12. #11 saeckereier, 06.01.2010
    saeckereier

    saeckereier Graue Eminenz

    Dabei seit:
    08.05.2005
    Beiträge:
    1.920
    Zustimmungen:
    0
    Ort:
    Im schönen Norden
    Und sinnfrei. Bei 30 Dateien und anscheinend eh nur verzögerter Anzeige ist das viel zu komplex. Zu mindest meiner Meinung nach. Klar, zum lernen wäre es was nettes. Aber bei Java plattformabhängigkeit zu erzeugen ist erfahrungsgemäß immer doof.
     
  13. #12 cinhtau, 06.01.2010
    Zuletzt von einem Moderator bearbeitet: 06.01.2010
    cinhtau

    cinhtau Guest

    Vorschlag

    Wie wäre es wenn du vom Original einen Hash bildest wie z.B. MD5 und dann wenn du die Datei lädst, den Hash von der kopierten Datei vergleichst. Erst wenn der Hash beider Dateien identisch ist, kannst du davon ausgehen, dass der Kopiervorgang abgeschlossen ist. Sollte dieser einfache Ansatz nicht dein Problem lösen?
     
  14. #13 Greenleon, 06.01.2010
    Greenleon

    Greenleon Tripel-As

    Dabei seit:
    08.01.2007
    Beiträge:
    184
    Zustimmungen:
    0
    Wann soll ich den Hash generieren? Ich kann ja erst hashen, wenn die Datei schon geladen ist...
     
  15. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  16. #14 saeckereier, 06.01.2010
    Zuletzt bearbeitet: 06.01.2010
    saeckereier

    saeckereier Graue Eminenz

    Dabei seit:
    08.05.2005
    Beiträge:
    1.920
    Zustimmungen:
    0
    Ort:
    Im schönen Norden
    Die Idee war, während die Datei halb da ist einen Hash zu berechnen und danach wieder. Wenn er sich verändert, wird die Datei noch kopiert. Keine Ahnung was man rauchen muss, um auf sowas zu kommen :-) Das wäre so ziemlich die unsinnigste Verwendung eines Hashes die mir einfällt.. Von allen vorgeschlagenen Lösungen scheinen bisher wirklich Änderungsdatum und Größe als die praktikabelsten.
    .
    .
    .
    EDIT (autom. Beitragszusammenführung) :
    .

    Alternativ lies dir mal das hier durch, lade das Beispiel runter und guck mal, wann das Event für file creation ausgelöst wird:

    http://java.sun.com/docs/books/tutorial/essential/io/notification.html
     
  17. #15 cinhtau, 07.01.2010
    cinhtau

    cinhtau Guest

    @sackeier
    nein, das ist nicht der ansatz - da hast du was geraucht

    Vorausetzung: man kennt den Hash der Original Datei
    Vor dem Laden erfolgt die Prüfung der Datei - stimmt der Hash nicht überein wird die Datei nicht geladen

    das ist der ansatz - simpler vergleich -

    apache projekte liefern zu ihren downloads immer auch einen md5-datei mit, damit man den Download verifizieren kann

    @TE
    der Lösungsansatz ist, bevor die Dateien in den Ordner wandern den Hash zu kennen
     
Thema:

Java: Ordner auf Aenderungen ueberwachen

Die Seite wird geladen...

Java: Ordner auf Aenderungen ueberwachen - Ähnliche Themen

  1. Werkstudent/ in als Mobile -Entwickler für Android (Java)

    Werkstudent/ in als Mobile -Entwickler für Android (Java): Werkstudent/ in als Mobile -Entwickler für Android (Java) Die DiOmega GmbH ist eine Agentur mit Sitz in Frankfurt am Main, die sich auf IT- und...
  2. Mobile -Entwickler für Android (Java) in Vollzeit (m/w)

    Mobile -Entwickler für Android (Java) in Vollzeit (m/w): Mobile -Entwickler für Android (Java) in Vollzeit (m/w) Die DiOmega GmbH ist eine Agentur mit Sitz in Frankfurt am Main, die sich auf IT- und...
  3. Java-Entwickler in Vollzeit (m/w)

    Java-Entwickler in Vollzeit (m/w): Java-Entwickler in Vollzeit (m/w) Die DiOmega GmbH ist eine Agentur mit Sitz in Frankfurt am Main, die sich auf IT- und Web-Dienstleistungen...
  4. iJUG: Sorge um JavaFX

    iJUG: Sorge um JavaFX: Für den iJUG mehren sich die Anzeichen, dass JavaFX keine große Zukunft mehr bei Oracle hat. So wurde die Unterstützung für die Version 8u33 von...
  5. Java-Anwendungsserver: WildFly 10 freigegeben

    Java-Anwendungsserver: WildFly 10 freigegeben: Der Java-Anwendungsserver WildFly ist in Version 10 erschienen. Die neue Version ist nur noch für Java 8 und 9 ausgelegt und kann unter anderem...