Prüfen ob Datei noch geöffnet ist

Hallo zusammen ,
ich habe ein externes Programm das mir eine Datei anlegt diese möchte ich mit meinem Parser durchlaufen . Mein Problem ist das ich nicht weiß wie lange das extreme Programm dafür braucht um alle Daten in die Datei zuschreiben . Meine Idee war nun über eine while(True) Schleife alle 2 Sekunden abzufragen ob diese noch geöffnet ist leider funktioniert das nicht .
 
Ich bin mir nicht sicher, ob man das wirklich über die File-API von Java hinbekommt, rauszufinden ob ein anderes Programm die Datei noch schreibt.

Wird das externe Programm von Java aus gestartet? Dann könnte man das ggf. auswerten ob es fertig ist.

Ansonsten sehe ich die Möglichkeit, alle 2 Sekunden zu prüfen ob sich die Dateigröße geändert hat. Wenn nein - vermutlich fertig.
 
Hat bei mir nicht wirklich geklappt. Ich habe dann als Workaorund die Datei einfach umbenannt. Wenn das geklappt hat ist sie wirklich geschlossen gewesen. Kann aber auch sein, dass ich beim Lock irgendwas falsch gemacht habe damals.

Gruß

Claus
 
Generell muss man da aber auch auf das Betriebssystem / Dateisystem achten. Unter Linux wird ein Umbenennen und Löschen gut funktionieren, auch wenn die Datei geöffnet ist. Die Applikation schreibt dann fleißig weiter und bekommt davon auch nichts mit :)

Und das Vorgehen dürfte sein:
a) Erst ein RandomAccessFile erzeugen mit rw -> So die Datei geblockt wurde wird dies schon fehlschlagen vermute ich.
b) Dann kann man sich mit getChannel den FileChannel geben lassen.
c) Mit dem FileChannel kann man dann noch ein tryLock aufrufen. Wenn da null zurück gegeben wurde, dann wird die Datei noch woanders geöffnet sein. (Ich vermute, dass hier ein komplett exclusiver Lock angefordert wird. Wenn die Datei also von jemandem nur gelesen wird der die Datei aber nicht exclusiv haben wollte und auch weiteres Schreiben erlaubte, dann wird so eine Verbindung ein solchen Exclusiven Lock verhindern. Daher vermute ich, dass Du hier eigentlich nie rein laufen wirst ...

Das sind aber jetzt größtenteils Vermutungen - ich habe mir nicht angesehen, was da denn unter dem Strich lokal aufgerufen wird.
 
Also ich hab das mit der Datei Größe versucht klappt aber nicht
Java:
while(true){
   if(file.length() > 0.0){
      // datei von meinem Programm öffnen
       break;
    }else{
      // datei noch geöffnet
   }
}
 
Nein, so funktioniert das auch nicht.
Ich meinte, ob sich die Größe ändert, nicht ob es eine Größe von ungleich 0 hat.

Also so in der Art
Java:
long oldSize = 0;
while(true) {
  long size = file.length();
  if (size == oldSize) {
    break;
  }
  oldSize = size;
  Thread.sleep(2000);
}
 
Also das mit der Dateigröße ist keine wirklich gute Lösung. Je nachdem, die die Datei geschrieben wird, kann es durchaus etwas dauern, bis die Größe sich ändert. Hast Du es mit dem Ansatz probiert, den ich beschrieben habe? Das könnte dann in etwa so aussehen:
Java:
    public static boolean isLocked(String fileName) {
        try (RandomAccessFile randomAccessFile = new RandomAccessFile(fileName, "rw");
             FileLock lock = randomAccessFile.getChannel().lock()) {
            return lock == null;
        } catch (IOException ex) {
            return true;
        }
    }
Edit: Bedingung umgedreht - muss lock == null sein und nicht lock != null!
 
Die Variante von JustNobody ist besser, meine ist eine Krücke, wenn die nicht greift, weil das FileSystem keine Möglichkeit bereitstellt um das zu prüfen.
 
Kleiner Tipp - Bei sowas immer in die API Doku schauen. Bei FileChannel.lock() handelt es sich um eine blocking Operation, die kehrt erst zurück, wenn ein Lock geholt wurde:

https://docs.oracle.com/javase/7/docs/api/java/nio/channels/FileChannel.html#lock() Verweist auf die lock Methode mit 3 Parametern und da steht:

An invocation of this method will block until the region can be locked, this channel is closed, or the invoking thread is interrupted, whichever comes first.
 
Alles klar super werd ich heute Abend testen vielen Dank euch allen ... wenn ich nicht weiter kommen sollte werde ich mich heute Abend noch mal melden
 
also entweder bin ich zu bl.... oder habe das nicht verstanden ich rufe isLocked(dateiName); auf und das programm macht gleich
mit den nächsten metoden weiter anstatt zu warten bis die datei zuende geschrieben ist
 
Java:
public static parser(){
isLocked(rootPathWin + "\\text.dat");
              
   dateiSplitt();
   parseDatei();
}


public static boolean isLocked(String fileName) {
        try (RandomAccessFile randomAccessFile = new RandomAccessFile(fileName, "rw");
                FileLock lock = randomAccessFile.getChannel().lock()) {
            return lock == null;
        } catch (IOException ex) {
            return true;
        }
    }
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben