我如何使用 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】:我刚才遇到了这个问题,这个页面是第一个搜索结果之一 - 我知道这是一个较老的问题,但由于没有确定的答案,我会冒昧地添加我的解决方案。 我看到的具体行为是,在创建文件时,Change 和 Create 事件均由 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 创建不改变的主要内容,如果未能解决你的问题,请参考以下文章
如何在 C# 控制台应用程序的多线程中同时实现 FileSystemWatcher 和 Timer?
FileSystemWatcher - 在删除时,复制一个文件
FileSystemWatcher不会使用'mv'命令检测移动到目录中的文件,也不会在ubuntu上剪切和粘贴