我如何使用 FileSystemWatcher 创建不改变

Posted

技术标签:

【中文标题】我如何使用 FileSystemWatcher 创建不改变【英文标题】:How can i use FileSystemWatcher created not change 【发布时间】:2018-07-10 01:25:36 【问题描述】:

我对 C# 的 FileSystemWatcher 有一些疑问。

这是我的代码如下。

    private void MyFileSystemWatcher()
    
        _watch = new FileSystemWatcher(path);
        _watch.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName | NotifyFilters.Size;
        _watch.Filter = "*.*";
        _watch.IncludeSubdirectories = true;

        _watch.Changed += new FileSystemEventHandler(_watch_Changed);
        _watch.Created += new FileSystemEventHandler(_watch_Created);

        _watch.EnableRaisingEvents = true;
    

    private void _watch_Changed(object sender, FileSystemEventArgs e)
    
        Console.WriteLine("File changed: 0", e.Name);
    

    private void _watch_Created(object sender, FileSystemEventArgs e)
    
        Console.WriteLine("File created: 0", e.Name);
    

当我将 book.txt 放到目录中时,这是我的结果。

File created: book.txt
File changed: book.txt

但这不是我预期的结果。我希望它只是触发创建的事件。

File created: book.txt

如何改进我的代码。我无法删除更改的事件,我使用了另一种情况。

【问题讨论】:

旁注:由于文件操作的实现方式,有时您确实会收到意想不到的通知序列...在正确监听文件更改后,您应该尝试其他操作 - 保存,以不同方式复制,复制粘贴/拖放并确保您明智地处理所有情况。 您是在移动文件还是创建副本?在任何情况下,请注意文件属性可能会因移动或复制文件而更新,因此会发生“更改”事件。 FileSystemWatcher 只是在做你要求它做的事情。如果您不想对特定的更改事件做出反应,那就不要。你到底在这里遇到了什么麻烦?不清楚你在问什么。 我需要 changed 事件来监控文件内容是否被修改。而且我需要创建的事件来监控新文件,而不是触发更改的事件。 【参考方案1】:

Changed 事件说:

对文件或目录中的文件或目录的大小、系统属性、上次写入时间、上次访问时间或安全权限进行更改时,将引发 Changed 事件被监控的目录。

您监视文件夹并通过向其中添加新文件来更改其大小,因此您会收到事件通知。

很自然,当您在文件系统上来回移动文件时,您可能会收到一系列不同的事件。您只需要阅读从事件中获得的属性并采取相应的行动。

【讨论】:

我不相信这个答案解决了这个问题。他们询问的更改事件实际上是针对文件,而不是目录。您回答的其他问题包括目录实际上没有大小(因此大小的变化不可能是触发通知的原因),并且您的回答 实际上并没有解决 OP 的问题,不管是什么【参考方案2】:

我刚才遇到了这个问题,这个页面是第一个搜索结果之一 - 我知道这是一个较老的问题,但由于没有确定的答案,我会冒昧地添加我的解决方案。 我看到的具体行为是,在创建文件时,ChangeCreate 事件均由 FileSystemWatcher 触发。

例如如果我在命令提示符下输入:

echo test >foobar.txt

..然后我的 FSW 触发 Change foobar.txt,然后 Creation 文件。虽然技术上是正确的,正如上面 Tigran 所解释的,但我真的只对向用户展示 Create 事件感兴趣。

我的解决方案很简单。我创建了一个布尔标志来指示 FSW 事件处理程序是否已触发,并在 Create 事件发生时将其设置为 TRUE。我修改了 Change 事件处理程序,只在标志设置为 false 时才采取行动。 换句话说,每个周期只处理一个事件(在我的例子中,当用户单击按钮确认事件时,标志被重置)并且优先级被赋予 Create 事件。

我希望这可以帮助遇到同样挑战的其他人。

【讨论】:

【参考方案3】:
private bool isOnCreated = false;

.....

private void _watch_Changed(object sender, FileSystemEventArgs e)

    if(isOnCreated)
       isOnCreated  = false;
    else
       Console.WriteLine("File changed: 0", e.Name);


private void _watch_Created(object sender, FileSystemEventArgs e)

    Console.WriteLine("File created: 0", e.Name);
    isOnCreated  = true;

【讨论】:

正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于我如何使用 FileSystemWatcher 创建不改变的主要内容,如果未能解决你的问题,请参考以下文章

如何使用特定用户执行外部 exe

如何在 C# 控制台应用程序的多线程中同时实现 FileSystemWatcher 和 Timer?

FileSystemWatcher - 在删除时,复制一个文件

FileSystemWatcher不会使用'mv'命令检测移动到目录中的文件,也不会在ubuntu上剪切和粘贴

错误 1053:服务未使用 FileSystemWatcher 及时响应启动或控制请求

使用 FileSystemWatcher 监视目录