Seite 1 von 1

Lesen einer Datei + Prüfung

Verfasst: 5. November 2009 14:12
von anno1988
hallo,

ich habe da ein kleines problem.

Ein externens Programm schreibt mir in ein Verzeichnis Dateien. Ich prüfe mit meinem zyklisch diese Dateien ab und werte sie aus. Das soll aber erst geschehen, wenn die Dateien vollständig auf der Festplatte liegen.

Kann ich das irgendwie prüfen, wann eine Datei feritg geschreiben ist und nicht mehr vom externen Programm verwendet wird?

gruß

anno1988

Verfasst: 5. November 2009 14:33
von RavenIV
Bei Windows gibt es einen Mechanismus, mit dem man sich benachrichtigen lassen kann, wenn sich in einem Verzeichnis oder bei einder Datei etwas verändert.

Muss mal schauen, ob man sich da mit Qt anhängen kann.
Eigentlich ist es ne Windows-Nachricht, die vom OS gesendet wird.

Verfasst: 5. November 2009 14:34
von AuE
Wann löst der QDirectoryWatcher denn sein Signal aus?

Verfasst: 5. November 2009 14:39
von RavenIV
AuE hat geschrieben:Wann löst der QDirectoryWatcher denn sein Signal aus?
Du meinst wohl QFileSystemWatcher http://doc.trolltech.com/4.2/qfilesystemwatcher.html

Verfasst: 6. November 2009 09:53
von anno1988
Hm ich weiß nicht ob diese Klasse das richtige ist.

nach der manual ist für meine problemstellugn nix dabei.

Verfasst: 6. November 2009 11:26
von dikilroy
Hi,

hast Du die Möglichkeit im schreibendem Programm die Datei zu sperren? Es gibt OS Funktionen die eine Datei sperren kann. Im Lesendem Prozess musst Du dann auf die Freigabe warten. Schau mal hier http://www.ecst.csuchico.edu/~beej/guide/ipc/flock.html (ist zwar C und Unix aber schonmal ein Ansatz)

Dann gibt es da noch den Semaphoren Ansatz, der über Prozessgrenzen Betriebsystem Mittel sperren kann (ähnlich dem Mutex).

Wenn das zu kompliziert ist, kann der schreibende Prozess ja auch eine ".lock" Datei schreiben (statt lock vieleicht der original Dateiname mit einem Punkt davor). Der lesende Prozess prüft ob so eine Datei vorhanden ist, und wartet solange bis die Datei gelöscht wurde.

Bei diesem Mechanismus musst Du aber den schreibenden Prozess ändern.

Wenn das nicht geht, dann wäre eine quick-dirty Lösung zu prüfen ob sich die Dateigrösse in einer gewissen Zeit noch ändert. Ist etwas fehleranfällig, aber könnte funktionieren.

Grüße
André

Verfasst: 6. November 2009 12:03
von anno1988
ja das stimmt, das wäre natürlich noch eine Möglichkeit. Was wahrscheinlich am besten ist, eine lock-Datei zu erzeugen und zu warten bis diese wieder gelöscht wurde, um die zu überprüfende Datei auszulesen.

Das wäre dann im Sinne von Qt auch am besten, da es dann wieder systemunabhängig ist.

Was hälst du von der idee, die Datei solange sie übertragen wird eine .lock-Endung zu geben und wenn diese vollständig übertragen wurde, wird die endung wieder entfernt bzw. die datei eben umbenannt?

Verfasst: 6. November 2009 12:53
von dikilroy
Was hälst du von der idee, die Datei solange sie übertragen wird eine .lock-Endung zu geben und wenn diese vollständig übertragen wurde, wird die endung wieder entfernt bzw. die datei eben umbenannt?
Natürlich auch möglich.
Hierbei ist natürlich der Hinweis aus dem Thread (http://qtforum.de/forum/viewtopic.php?t=10240) zu berücksichtigen, dass der schreibende Prozess möglicherweise abstürzt, und somit die Datei nicht löschen kann / nicht umbenennen kann.

Grüße
André

PS
Es gibt aber aber Betriebsystem Mittel! Da müsste man mal weiterforschen ...

Verfasst: 6. November 2009 12:54
von NoRulez
Was hältst Du von QtLockedFile.

LG NoRulez

Verfasst: 6. November 2009 13:55
von dikilroy
NoRulez hat geschrieben:Was hältst Du von QtLockedFile.

LG NoRulez
Dachte ich mir, dass es dazu eine Qt Klasse gibt. Hatte die nur nicht gefunden. Warum ist das denn nicht direkt in QFile drin, und warum ein Addon? Egal, offtopic!

Glaube auch das dies Dein Problem lösen könnte, unter der Voraussetzung, dass Du das externe Programm ändern kannst.

cu
André

Verfasst: 6. November 2009 14:43
von anno1988
Ja, das externe programm kann ich da schon verändern.

Ok, dnake für die Hilfe, ich schaue mal was ich so verwenden werden, ich habe jetzt ja ein paar Ansatzmöglichkeiten. :D :D

Verfasst: 6. November 2009 17:12
von NoRulez
@dikilroy: Weil es bisher als Qt Solutions nur für kommerzielle Lizenzen zur Verfügang stand.

LG NoRulez