[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte
  1. #1
    KM is offline [professional_User]
    Registriert seit
    Apr 2003
    Beiträge
    1.005

    Probleme beim Löschen von Dateien

    Hallo,

    mein Problem gehört jetzt zwar nicht direkt in die Kategorie Java auf iSeries, aber vielleicht kann mir trotzdem jemand helfen.

    Ich habe derzeit massive Probleme beim Löschen von Dateien. Ich habe z.B. folgenden Java-Code, der auf einem Windows-Server unter Java 1.6 läuft:

    Code:
    // Dateien einzeln runterladen
    FileOutputStream fos = new FileOutputStream(new File(localfile));
    c.get(remotefile, fos);  // --> FTP-Übertragung
    fos.close();
    fos = null;
    System.gc();
    .
    .
    .
    File f = new File(localfile);
    f.delete();
    Der Teil, der durch die Punkte dargestellt ist, ist für alle Dateien gleich.
    Wenn ich die Routine mit mehreren Dateien durchlaufe, werden nur manche sporadisch gelöscht und manche bleiben stehen. Es sollen eigentlich alle gelöscht werden.

    Jetzt habe ich schon mehrfach gelesen, dass man vor dem delete() unbedingt den Garbage Collector anschubsen soll, weil es sonst Probleme geben könnte. Auf der anderen Seite habe ich aber auch gelesen, dass der System.gc() eigentlich nie verwendet werden soll. Ich dachte eigentlich, dass mit obigem Code die Referenzen auf die localfile komplett gelöscht werden, so dass der delete eigentlich funktionieren müsste. Das scheint aber nicht so zu sein.

    Wie kann ich denn sonst noch sicherstellen, dass eine Datei auch wirklich gelöscht wird ?

    Danke,
    KM

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Ich denke, indem du sie nicht verwendest.
    Es muss doch andere Befehle geben, die eine Datei löschen ohne sie erst mal zu öffnen.

    Für den GC musst du ggf. deinen Thread mal ein bisschen pausieren, damit der gc auch Zeit bekommt.

    Andererseits müsste der f.delete() einen Fehler auslösen, dass das z.Zt. nicht geht.
    Bekommst du keinen Fehler, kommst du im Code an der Datei nicht vorbei.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  3. #3
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    soweit man das in diesem Ausschnitt sehen kann, sieht das nach works as designed aus. Dein f.delete() wird von Windows ausgeführt, das wohl Einwände wg. Benutzung hat (die durchaus von noch nicht vom gc abgeholten Objekten kommen könnten), in solchen Fällen kommt dann halt false zurück. Der Aufruf von System.gc() kommt zurück, wenn die Runtime meint, dass sie jetzt genug aufgeräumt hat, ansonsten ist der gc eh' nebenläufig in einem eigenen Thread.
    Ich denke das kriegt man nur im Design weg, notfalls ein Pool von temporären Objekten/Dateien und einem eigenen Aufräumthread, wobei ich erst nochmal ein wenig über die zu Grunde liegende Anforderung nachdenken würde!

    mfg

    Dieter Bender
    Zitat Zitat von KM Beitrag anzeigen
    Hallo,

    mein Problem gehört jetzt zwar nicht direkt in die Kategorie Java auf iSeries, aber vielleicht kann mir trotzdem jemand helfen.

    Ich habe derzeit massive Probleme beim Löschen von Dateien. Ich habe z.B. folgenden Java-Code, der auf einem Windows-Server unter Java 1.6 läuft:

    Code:
    // Dateien einzeln runterladen
    FileOutputStream fos = new FileOutputStream(new File(localfile));
    c.get(remotefile, fos);  // --> FTP-Übertragung
    fos.close();
    fos = null;
    System.gc();
    .
    .
    .
    File f = new File(localfile);
    f.delete();
    Der Teil, der durch die Punkte dargestellt ist, ist für alle Dateien gleich.
    Wenn ich die Routine mit mehreren Dateien durchlaufe, werden nur manche sporadisch gelöscht und manche bleiben stehen. Es sollen eigentlich alle gelöscht werden.

    Jetzt habe ich schon mehrfach gelesen, dass man vor dem delete() unbedingt den Garbage Collector anschubsen soll, weil es sonst Probleme geben könnte. Auf der anderen Seite habe ich aber auch gelesen, dass der System.gc() eigentlich nie verwendet werden soll. Ich dachte eigentlich, dass mit obigem Code die Referenzen auf die localfile komplett gelöscht werden, so dass der delete eigentlich funktionieren müsste. Das scheint aber nicht so zu sein.

    Wie kann ich denn sonst noch sicherstellen, dass eine Datei auch wirklich gelöscht wird ?

    Danke,
    KM
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  4. #4
    KM is offline [professional_User]
    Registriert seit
    Apr 2003
    Beiträge
    1.005
    Das heißt ich muß dann wohl eine Schleife programmieren, in der ich immer wieder versuche die Datei zu löschen, bis es endlich funktioniert hat.

    Und dabei geht es doch nur um so eine banale Sache wie das Löschen einer Datei...

    Gruß,
    KM

  5. #5
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Eigentlich sollte der Close die Datei wieder freigeben.
    Ggf. hast du aber noch ein anderes Objekt, dass die Datei noch geöffnet hält ?
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  6. #6
    Registriert seit
    Oct 2004
    Beiträge
    240
    Wenn die Files keinen weiteren Einfluss auf die Programmlogik haben, könntest du es mit:

    deleteOnExit() probieren, der merkt sich die Datei bis zum Ende VM und löscht sie dann.

    eventuell auch.
    if (!file.delete()) {
    file.deleteOnExit();
    }

    Hier die API

    /Robert

  7. #7
    KM is offline [professional_User]
    Registriert seit
    Apr 2003
    Beiträge
    1.005
    Hallo Robert,

    den deleteOnExit hab ich auch schon gesehen. Aber wie Du schon sagst löschen der die Datei erst beim Beenden der JVM. Und da das Programm in einem Tomcat läuft, würde das ewig warten, weil dieser nur einmal am Tag neu gestartet wird.

    Ich werd's wohl doch mal mit einer Schleife versuchen. Bleibt mir wohl nix anderes übrig.

    Trotzdem Danke,
    KM

  8. #8
    Registriert seit
    Oct 2004
    Beiträge
    240
    Noch eine andere Frage:
    Wo wird den die Datei verarbeitet?

    Ich nehme an, dass c.get den FTP Transfer mach. Irgendwo muss das File ja ja auch verarbeitet (InputStream) werden. Dort könnte es ja auch Referenzen geben.

    /Robert
    .

  9. #9
    KM is offline [professional_User]
    Registriert seit
    Apr 2003
    Beiträge
    1.005
    Ja, der c.get macht den FTP-Transfer. Bei dieser Datei handelt es sich um eine XML-Datei, die nach der Übertragung einfach nur validiert wird und dann wieder gelöscht wird.

    Jetzt hab ich mal direkt nach der Validierung in einem finally-Block eingebaut, dass die Referenzen sämtlicher verwendeter Objekte explizit auf null gesetzt werden. Und danach führe ich noch einen System.gc() durch. Mal sehen was ich jetzt für ein Ergebnis erhalte. Wenn das Problem dann immernoch besteht, kann es eigentlich nur noch ein Zeitproblem sein, weil der GC dann offenbar nicht schnell genug greift.

    Gruß,
    KM

  10. #10
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Wie gesagt, der gc dürfte gar nicht das Problem sein, da dieser nur aufräumt (vergessene Close auch schließt).

    Ein expliziter Close muss die Ressource Datei freigeben!

    Vielleicht gibts ja eine Ausnahme, die dein Programm nicht zum Close der Datei führt, so dass eben der Delete fehlschlägt.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  11. #11
    Registriert seit
    Sep 2008
    Beiträge
    6
    huhu,

    bei mir war es auch mal ein einfacher stream (Buffer/file) wo durch die Datei sich nicht löschen lies . Musste beide streams ganz am ende nochmal closen und dann gings.

    mfg mathias

  12. #12
    KM is offline [professional_User]
    Registriert seit
    Apr 2003
    Beiträge
    1.005
    nur zur Info...

    Nachdem ich meine Applikation folgendermaßen geändert habe...

    Jetzt hab ich mal direkt nach der Validierung in einem finally-Block eingebaut, dass die Referenzen sämtlicher verwendeter Objekte explizit auf null gesetzt werden. Und danach führe ich noch einen System.gc() durch.
    ...hab ich das jetzt mal eine Weile verfolgt. Jetzt ist der Fehler nicht mehr aufgetreten, sondern alles läuft problemlos. Offenbar sollte man doch immer alles selber auf null setzen und sicherheitshalber den System.gc() mal aufrufen.

    Gruß,
    KM

Similar Threads

  1. Dateien auf dem IFS löschen
    By codierknecht in forum NEWSboard Programmierung
    Antworten: 10
    Letzter Beitrag: 27-08-08, 05:13
  2. Dateien aus dem IFS löschen
    By Bobou in forum IBM i Hauptforum
    Antworten: 14
    Letzter Beitrag: 16-01-07, 10:26
  3. Dateien im IFS bzw. QDLS über Explorer löschen
    By dino in forum IBM i Hauptforum
    Antworten: 9
    Letzter Beitrag: 08-12-06, 19:14
  4. Dateien in QDLS bzw. IFS über Explorer löschen
    By dino in forum IBM i Hauptforum
    Antworten: 6
    Letzter Beitrag: 22-05-06, 18:59
  5. Dateien im freigegebenen Ordner im IFS löschen
    By Enatz in forum IBM i Hauptforum
    Antworten: 7
    Letzter Beitrag: 07-12-05, 21:10

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •