Frage

Ist es möglich, eine Textdatei zu öffnen und den Inhalt zu lesen, während eine andere Anwendung die Datei aktualisiert, so dass es keine Sperre Konflikt verursacht?

Ich brauche eine Log-Datei von einer Anwendung zu überwachen, die von einer anderen Anwendung jedes Mal ein Ereignis eintritt, aktualisiert wird.

Ich überprüfe, ob die Datei in Gebrauch ist, bevor ich versuche, es zu lesen, aber das scheint nicht in allen Fällen zu arbeiten.

Danke, Pieter

War es hilfreich?

Lösung

es hängt davon ab, wie die erste App, die Datei öffnen.

das heißt, wenn Createfile API aufrufen, eine Datei zu öffnen, gibt es dwShareMode param, die die api erzählt, wie es zu öffnen (wenn dies 0 gegeben wurde, kann sie nicht von anderen Anwendungen IIRC zugegriffen werden). ansonsten sollte es kein Problem sein, mit aus dieser Datei zu lesen. wenn im nicht irrt, um zu überprüfen, ob die Datei gelesen wird, geöffnet wird nur u anrufen so etwas wie

CreateFile(pchar(fName), GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0) ;

Andere Tipps

  1. Download Process Monitor von Sysinternals.
  2. Öffnen Sie den Filterdialog und fügen Datei einen „Pfad“ Filter für die Protokoll.
  3. Starten Sie die Log-Schreiben-Anwendung (ich nenne dieses "Logwriter").
  4. Suchen und klicken Sie auf die Veranstaltung, bei der Logwriter ein Create der Fall ist.
  5. Unter "Detail", soll es haben "Desired Zugang: Allgemein Write". „: Read ShareMode“, die im Aufruf von Createfile FILE_SHARE_READ entsprechen und es haben sollte. Was es bedeutet, ist: "Ich, Logwriter, erlauben andere lesen meine Datei".
  6. Führen Sie nun Ihre Log-Leseanwendung ( "Logreader"), und das gleiche tun Übung.
  7. sollten die Details haben „Gewünschter Zugriff: Allgemein Read“. Und es sollte. „ShareMode: Lesen, Schreiben“, was bedeutet: „Ich, Logreader, erlauben andere, einschließlich Logwriter, in die Protokolldatei zu lesen und schreiben“

Das sind die vernünftigste Werte, glaube ich, und sie werden Verriegelung verhindern. Andere Kombinationen zulässig sein. Es ist eine Tabelle, hier .

Jetzt haben Sie nicht gesagt, was passiert, wenn es „scheint nicht in allen Fällen zu arbeiten“. Was hängt neben tun wirklich auf die Details. Hoffentlich wird die oben haben Sie genügend Informationen geben, um herauszufinden, was schief läuft.

Sie werden keinen Sperrkonflikt, weil die Schreibanwendung sehr unwahrscheinlich ist, um die Datei gesperrt haben. Zu tun, was Sie vorschlagen, funktioniert in der Regel ohne Probleme (es ist, was das UNIX tail -f Befehl der Fall ist) und diese kleinere Probleme, die ignoriert werden, auftreten können. Ich habe ein paar von Log-Monitoring-Anwendungen in te Vergangenheit geschrieben, der so gearbeitet, ohne Probleme.

Versuchen Sie Filesystemwatcher Ereignisse zu erhalten, wenn eine Datei aktualisiert wird.

Eine delphi freundliche Link

Ganz abgesehen das File-Sharing von immer Recht auf Arbeit, die auf dem, was die anderen Programmanforderungen abhängig unmöglich sein kann, werden einige Programme die Datei zwischen Zugriffen schließen.

Ich habe Erfolg in der Vergangenheit mit meinem Programm wartet, bis die Datei verfügbar wird, dann ist es schnell zu öffnen, um die benötigten Daten greifen und Schließen. Zumindest in DOS ein Versuch, eine gesperrte Datei zuzugreifen, verursachte ein paar Wiederholungen, und ich stieß diese Einstellung, so dass, wenn das andere Programm für die Datei versucht, während ich es hätte, würde sie einfach verzögert werden und nie einen Fehler sehen.

Ich war sogar in der Lage, die Datei zu aktualisieren (ich sicher, dass nicht um es zu schließen dazwischen!) Ohne das andere Programm überhaupt etwas wissen.

hässlich wie die Sünde, aber wir konnten nicht das andere Programm ändern, so dass es der einzige Weg war getan, um den Job zu bekommen. Es wurde jahrelang im Haus eingesetzt, hörte ich nie einen Pieps von den Nutzern dieses Systems. Es ging schließlich weg, wenn die Maschine das andere Programm gesteuert zurückgezogen wurde.

XpoLog den Trick ohne Ihre env oder Code zu ändern, XpoLog Log Monitor

Avar ist richtig - Sie auf die Gnade des Schreibprogramms sind hier. Wenn sie die Datei sperren, dann gibt es ein paar Dinge, die Sie tun können:

1 - Überprüfen Sie für einen Änderung der „zuletzt geändert“ Datum Zeit -. wenn sich das ändert, dann wissen Sie etwas ist geschehen

2 - Wenn die Mod Datetime nicht geändert hat, dann (abhängig von der Größe der Datei) könnte es gut genug sein, um eine Kopie der Datei zu erstellen und überprüfen , dass

.

wir "Leitwerk für win32" verwenden,

Ich weiß, es ist nicht delphi, aber es könnte nützlich sein,

http://tailforwin32.sourceforge.net/

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top