Datei erkennen C # lesen

8

Ich verwende FileSystemWatcher, um zu überprüfen, wenn eine Datei geändert oder gelöscht wird, aber ich frage mich, ob es eine Möglichkeit gibt zu überprüfen, wenn eine Datei von einer anderen Anwendung gelesen wird.

Beispiel: Ich habe die Datei C: \ test.txt auf meiner Festplatte und beobachte sie mit FileSystemWatcher. Ein anderes Programm (nicht unter meiner Kontrolle) liest diese Datei; Ich möchte dieses Ereignis abfangen und wenn möglich prüfen, welches Programm die Datei liest, dann den Inhalt der Datei entsprechend ändern.

    
Petey B 01.09.2010, 19:55
quelle

6 Antworten

4

Es klingt so, als ob Sie in Ihre Protokolldatei schreiben möchten, wenn Ihre Protokolldatei extern gelesen wird, oder etwas Ähnliches. Wenn dies der Fall ist, gibt es einen NotifyFilters-Wert, LastAccess. Stellen Sie sicher, dass dies als eines der Flags in Ihrer FileSystemWatcher.NotifyFilter-Eigenschaft festgelegt ist. Eine Änderung der letzten Zugriffszeit löst dann das Changed-Ereignis auf FileSystemWatcher aus.

Gegenwärtig erlaubt es FileSystemWatcher nicht, direkt zwischen einem Lesen und einer Änderung zu unterscheiden. Beide feuern das Changed-Ereignis basierend auf der "Änderung" zu LastAccess. Es wäre daher unmöglich, nach einer großen Anzahl von Dateien zu suchen. Sie scheinen jedoch zu wissen, welche Datei Sie sich ansehen. Wenn Sie also ein FileInfo-Objekt für diese Datei haben und FileSystemWatcher das Changed-Ereignis ausgelöst hat, können Sie ein neues abrufen und die LastAccessTime-Werte vergleichen. Wenn sich die Zugriffszeit geändert hat und LastWriteTime nicht, wird Ihre Datei nur gelesen.

Nun, in einfachen Worten, Änderungen, die Sie an der Datei vornehmen, während sie gelesen wird, werden nicht sofort in der anderen App erscheinen, noch werden Sie in der Lage sein, "zuerst dorthin zu gelangen", die Datei zu sperren und Schreib es, bevor sie es sehen. Daher können Sie FileSystemWatcher nicht verwenden, um eine Leseanforderung abzufangen und den Inhalt anzuzeigen, den diese App sehen soll. Der Benutzer einer anderen Anwendung kann nur sehen, was Sie gerade geschrieben haben, wenn die Anwendung die Datei ebenfalls überwacht und die Datei erneut lädt. Dadurch wird ein anderes Changed-Ereignis ausgelöst, das eine Endlosschleife verursacht, solange die andere Anwendung die Datei erneut lädt.

Sie erhalten auch ein Changed Event für ein Lesen und Schreiben. Wenn Sie eine Datei in einem Texteditor öffnen (was praktisch jeder tun kann), werden einige Änderungen vorgenommen. Wenn Sie nach Änderungen an der letzten Zugriffszeit suchen, werden beim Speichern zwei geänderte Ereignisse ausgelöst. Der erste wird ausgelöst, wenn die Datei vom Editor geöffnet wird. Zu diesem Zeitpunkt können Sie möglicherweise nicht feststellen, dass ein Schreibvorgang ausgeführt wird. Wenn Sie also nach reinen schreibgeschützten Zugriffen auf die Datei suchen, sind Sie SOL.

    
KeithS 01.09.2010, 20:37
quelle
2

Der einfachste Weg, den ich mir vorstellen könnte, wäre ein Timer (System.Threading.Timer), dessen Callback das letzte

überprüft und speichert %Vor%

Etwas wie (vielleicht mit etwas mehr Sperren ...)

%Vor%     
Jeff 01.09.2010 20:13
quelle
2

Es gibt das Programm FileMon von SysInternals ... Es kann jeden Dateizugriff im System verfolgen. Wenn Sie die Quelle finden und verstehen, welche Win32-Hooks verwendet werden, können Sie diese Funktionen in C # marshalieren und bekommen, was Sie wollen.

    
alxx 01.09.2010 20:16
quelle
1

Sie könnten FileInfo.LastAccessTime und FileInfo.Refresh () in einer Abrufschleife verwenden.

Ссылка

    
Jonathan S. 01.09.2010 20:09
quelle
0

Ja, mit dem Dateisystem-Filtertreiber können Sie alle Leseanfragen erfassen, analysieren und sogar die gelesenen Daten ersetzen. Die Entwicklung eines solchen Treibers ist möglich, jedoch sehr zeitaufwendig und kompliziert. Wir bieten ein Produkt namens CallbackFilter an, das einen gebrauchsfertigen Treiber enthält und Sie Ihre Filtergeschäftslogik im Benutzermodus implementieren kann.

    
quelle
-2

Ein kleines Snippet , das ich nützlich fand um festzustellen, wann ein anderer Prozess eine Sperre hat:

%Vor%     
John M 01.09.2010 20:04
quelle

Tags und Links