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

时间:2016-05-25 19:37:42

标签: c# printf filesystemwatcher

是的,有很多类似的问题,但没有一个能解决我的独特情况。

使用c ++ printf和fprintf编写文件有一个单独的c ++进程。 我想看的文件名是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))
            {

            }
        }
    }

2 个答案:

答案 0 :(得分:1)

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

FileSystemWatcher使用对文件的LastWrite属性的更新来触发事件,但是,LastWrite不会实时更新,不应该依赖于事件的触发器。

如果你手上有足够的时间和资源,那么你可能想要研究File System Filters以及Filter Manager and Minifilter Driver更简单的方法。这是驱动程序类型开发,但它是实现目标的可靠文件方式。

根据系统政策进行深入挖掘,但是会给你一个wide array of events来锁定。如果我是为了执行pci一致性或类似任务而执行此操作,那么我就不会使用FileSystemWatcher。

答案 1 :(得分:0)