# Wie prüfen ob eine Datei vom OS fertig geschrieben wurde?



## jollyroger (16. Mrz 2007)

Hallo, 

ich hab eine Applikation, die unter anderem Dateien aus definierten Verzeichnissen einliest.

In diese Verzeichnisse können die Dateien auf verschiedensten Wegen gelangen (händisch kopieren, scripte usw.)

Nun möchte ich sicherstellen, das - wenn ich die Dateien einlese - diese schon komplett in das Verzeichnis geschrieben wurde, so das ich nicht eine Datei einlese die noch mitten im Kopiervorgang ist.

Wie stell ich das am Besten an?

2 Ideen hatte ich bisher:

1. Da meine Applikation nur auf Linux-Kisten laufen wird, dachte ich daran mit "lsof" zu prüfen, ob irgendein anderer Prozeß auf die Datei zugreift.

2. Nach einem definierten Intervall die Grösse der Datei prüfen. Hat sie sich nicht geändert wäre das ein (unsicheres)  Indiz dafür das sie fertig geschrieben wurde.

Ich finde beide Möglichkeiten nicht so toll, fällt jemand eine bessere Möglichkeit ein?


----------



## Leroy42 (16. Mrz 2007)

Wenn du prüfen kannst, ob ein anderer Prozeß
die Datei _in der Mangel hat_, wäre das doch
ein vernünftiger Lösungsansatz.

Die Längenprüfung, da gebe ich dir Recht, ist
nicht zu empfehlen.


----------



## jollyroger (16. Mrz 2007)

Ja, 

an der ersten Möglichkeit stört mich halt, dass 

- es nicht mehr plattformunabhängig ist (ok, es sei denn auf der windows-Kiste ist cygwin mit lsof). Auch wenn die Applikation später nur unter Linux laufen soll, fände ich schöner das trotzdem offen zu halten.
- ich die Rückgabe von lsof auswerten muss

Ich dachte es gäbe da auch java-Mittel, hab aber leider in der API-Doku  unter File* nichts entsprechendes gefunden...

Wenn noch jemand eine Idee hat nur raus damit, ansonsten werde ich halt lsof nehmen (mit Bauchschmerzen).


----------



## Marcel Gascoyne (19. Mrz 2007)

Ich mach das immer so dass der schreibende Prozess erstmal eine temporäre Datei erzeugt oder per FTP/SSH überträgt. Erst wenn die Datei vollständig ist wird diese in den richtigen Dateinamen umbenannt.

Eine andere alternative ist die Erzeugung einer leeren Flag-Datei, die erst nach der Erzeugung der Datendatei angelegt wird. Das Programm muss dann prüfen ob diese Datei existiert bevor die eigentliche Datendatei verarbeitet werden kann.

Gruß,
Marcel


----------



## Hilefoks (19. Mrz 2007)

Marcel Gascoyne hat gesagt.:
			
		

> Eine andere alternative ist die Erzeugung einer leeren Flag-Datei, die erst nach der Erzeugung der Datendatei angelegt wird.


Ganz ähnlich mache ich es auch - nur das meine Flag-Datei eine md5 Datei ist. Dies bietet mir zwei Vorteile gegenüber deiner Methode:

a) Ich kann dem Benutzer besser "verkaufen" das mein Programm nur Dateien mit gültigen md5-Summen verarbeitet als das ich ihm umständlich erkläre das er die Daten erst umbennen muss, dann kopieren, dann wieder umbennen... oder auch das er eine zusätzliche Datei erstellen muss (was er zwar mit md5 auch tut, für ihn aber auch Sinn ergibt). 

b) Mein Programm kann testen ob die Datei korupt ist. Wenn die md5 nicht stimmt ist die Datei korupt oder nicht fertig kopiert. Dann merke ich mir die falsche md5-Summe der Datei und teste einige Sekunden später nochmals. Sollte die md5 dann immer noch nicht stimmen und die letzte md5 der Datei (die ich mir gemerkt habe) gleich der aktuellen sein dann ist die Datei korupt - ansonsten ist sie noch am kopieren.

MfG,
Hilefoks


----------



## HoaX (20. Mrz 2007)

mittels nio solltest du das hinbekommen die datei zu öffnen und dann zu locken, wenn sie sich nicht locken lässt greift wohl grad noch jemand anderes darauf zu. siehe FileChannel oder so - hab bislang nie wirklich was mit nio gemacht


----------



## thE_29 (20. Mrz 2007)

Die Frage ist aber, ob die andere Datei das sperrt..

Manchmal kann man ja Files die man runterlädt net mal wegkopieren == komplett gesperrt! Manchmal gehts aber schon.. Da stellt sich die Frage ob das gesperrt ist oder nicht!

Und Linux ist sowieso eine andere Geschichte.. Da kannst du ein jar File löschen das du gerade ausführst... Oder Scripte können sich selbst löschen..


----------

