使用 fprintf 或 printf 写入文件时,FileSystemWatcher 不触发事件

FileSystemWatcher not firing events when file written using fprintf or printf

是的,有很多类似的问题,但其中 none 解决了我的独特情况。

有一个单独的 c++ 进程使用 c++ printf 和 fprintf 写入文件。 我要观看的文件名是 info_20160525.log

我在 winform C# 应用程序中的 fileSystemWatcher 在编写器进程写入文件时收到通知并且我物理访问文件即 F5 文件夹或在文本板中打开它并单击打开的文件或右键单击文件但我从来没有当我不与文件进行物理交互时收到任何事件通知。 此外,当我关闭编写器应用程序时,我会收到通知。

这是我的代码。

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;
}

这些是处理程序。我在每个文件中都有断点,但除非我与文件进行物理交互,否则我永远不会触发。

    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))
            {

            }
        }
    }

确保将 IncludeSubdirectories 设置为 true。

https://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher(v=vs.110).aspx

我打赌这个帖子有你的答案 --> FileSystemWatcher changed event (for “LastWrite”) is unreliable

FileSystemWatcher 使用对文件的 LastWrite 属性的更新来触发事件,但是,LastWrite 不是实时更新的,不应将其作为事件的触发器。

如果您手头有足够的时间和资源,那么您可能想研究一下 File System Filters and the simpler approach of a Filter Manager and Minifilter Driver。它是驱动程序开发,但是,它是完成您的 objective.

的可靠文件方式

系统策略对它进行了更深入的挖掘,但为您提供了一个 wide array of events 来锁定。如果我这样做是为了 pci 合规性或类似任务,那么我不会使用 FileSystemWatcher。