2016-05-25 10 views
1

Ja, es gibt viele ähnliche Fragen, aber keine von ihnen adressiert meine einzigartige Situation.FileSystemWatcher löst keine Ereignisse aus, wenn eine Datei mit fprintf oder printf geschrieben wurde

Es gibt einen separaten C++ - Prozess, der die Datei mit C++ printf und fprintf schreibt. Dateiname i zu sehen versuche, ist info_20160525.log

Mein Filesystemwatcher in winform C# -Anwendung Benachrichtigung erhält, wenn der Schreiber-Prozess in die Datei schreibt und ich Zugriff auf die Datei physikalisch dh F5 den Ordner oder haben es in textpad öffnen und klicken Sie auf die geöffnete Datei oder klicken Sie mit der rechten Maustaste auf die Datei, aber ich erhalte nie eine Ereignisbenachrichtigung, wenn ich nicht physisch mit der Datei interagiere. Auch, wenn ich die Writer-Anwendung heruntergefahren bekomme ich die Benachrichtigung.

Hier ist mein Code.

public bool StartUp(string fullfilepath, int linenumber) 
{ 
     if (!File.Exists(fullfilepath)) 
      return false; 
     if (!LogClass.CheckPathExists(m_applicationPath)) 
      return false; 

     try 
     { 

      FileInfo info = new FileInfo(fullfilepath); 

      m_filename = fullfilepath; 
      m_fileWatcher = new FileSystemWatcher(info.DirectoryName, info.Name); 
      m_fileWatcher.NotifyFilter = NotifyFilters.Attributes | NotifyFilters.LastAccess 
     | NotifyFilters.LastWrite | NotifyFilters.Size ;  

      m_fileWatcher.Changed += m_fileWatcher_Changed; 
      m_fileWatcher.Error += m_fileWatcher_Error; 
      m_fileWatcher.Created += m_fileWatcher_Created; 
      m_fileWatcher.Deleted += m_fileWatcher_Deleted; 
      m_fileWatcher.Disposed += m_fileWatcher_Disposed; 
      m_fileWatcher.Renamed += m_fileWatcher_Renamed; 
      m_linesRead = linenumber; 
      m_fileWatcher.EnableRaisingEvents = true; 
     } 
     catch(Exception e) 
     { 
      LogClass.LogError(e, "Trouble accessing the file" + fullfilepath, m_applicationPath); 
     } 
     return true; 
} 

Dies sind die Handler. Ich habe Haltepunkte in jedem von ihnen, aber ich bekomme nie einen Auslöser, außer natürlich physisch mit der Akte zu interagieren.

void m_fileWatcher_Renamed(object sender, RenamedEventArgs e) 
    { 
     string S = ""; 
    } 

    void m_fileWatcher_Disposed(object sender, EventArgs e) 
    { 
     string S = ""; 
    } 

    void m_fileWatcher_Deleted(object sender, FileSystemEventArgs e) 
    { 
     string S = ""; 
    } 

    void m_fileWatcher_Created(object sender, FileSystemEventArgs e) 
    { 
     string S = ""; 
    } 

    void m_fileWatcher_Error(object sender, ErrorEventArgs e) 
    { 
     string S = ""; 

    } 

    void m_fileWatcher_Changed(object sender, FileSystemEventArgs args) 
    { 
     if (args.ChangeType == WatcherChangeTypes.Changed) 
     {     
      while (ParseFile(args.FullPath)) 
      { 

      } 
     } 
    } 

Antwort

1

ich diesen Thread Wette hat Ihre Antwort ->FileSystemWatcher changed event (for “LastWrite”) is unreliable

Das Filesystemwatcher ein Update auf das LastWrite Attribut einer Datei verwendet, um Ereignisse auszulösen, jedoch ist die LastWrite nicht in Echtzeit aktualisiert und sollte nicht als Auslöser für ein Ereignis herangezogen werden.

Wenn Sie genug Zeit und Ressourcen auf Ihren Händen haben, dann möchten Sie wahrscheinlich in File System Filters und die einfachere Vorgehensweise eines Filter Manager and Minifilter Driver suchen. Es ist eine Treiber-Typ-Entwicklung, aber es ist eine sichere Datei, um Ihr Ziel zu erreichen.

Es ist ein wenig tiefer durch Systemrichtlinie gegraben, aber gibt Ihnen eine wide array of events zum Einklinken. Wenn ich dies für etwas wie PCI-Konformität oder ähnliche Aufgaben tun würde, würde ich den FileSystemWatcher nicht verwenden.

+0

danke, rate stream öffnet/schließt Ereignisse. Flush() nicht. also kann ich fileysstemwatcher in diesem Fall nicht benutzen. Ich benutze Umfragen. Das Problem ist, dass die Datei über das Netzwerk ist und vollständige Dateien lesen, um die Deltas alle paar Sekunden zu erhalten, ist eine Menge Netzwerklast. – bsobaid

Verwandte Themen