我如何使用 FileSystemWatcher 创建而不更改
How can i use FileSystemWatcher created not change
我对 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
我怎样才能改进我的代码。我无法删除已更改的事件,我使用了另一种情况。
Changed 事件表示:
The Changed event is raised when changes are made to the size, system attributes, last write time, last access time, or security permissions of a file or directory in the directory being monitored.
您监控文件夹并通过向其中添加新文件来更改其大小,因此您会收到事件通知。
所以很自然地,当您在文件系统上来回移动文件时,您可能会遇到一系列不同的事件。您只需要阅读从事件中获得的 属性 并采取相应的行动即可。
我 运行 刚刚进入这个问题,这个页面是第一个搜索结果之一 - 我知道这是一个较旧的问题,但由于没有确凿的答案,我会冒昧地添加我的解决方案.
我看到的具体行为是,在创建文件时,FileSystemWatcher 触发了 Change 和 Create 事件。
例如如果我在命令提示符下键入:
echo test >foobar.txt
..然后我的 FSW 为 foobar.txt 的 Change 开火,然后 Creation 文件。虽然技术上是正确的,如上面 Tig运行 所解释的,但我真的只对向用户呈现 Create 事件感兴趣。
我的解决方案很简单。我创建了一个布尔标志来指示 FSW 事件处理程序是否已触发,并在 Create 事件发生时将其设置为 TRUE。我修改了 Change 事件处理程序,使其仅在标志设置为 false 时才执行操作。
换句话说,每个周期只处理一个事件(在我的例子中,当用户点击一个按钮确认事件时,标志被重置)并且优先考虑创建事件。
我希望这对遇到同样挑战的其他人有所帮助。
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;
}
我对 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
我怎样才能改进我的代码。我无法删除已更改的事件,我使用了另一种情况。
Changed 事件表示:
The Changed event is raised when changes are made to the size, system attributes, last write time, last access time, or security permissions of a file or directory in the directory being monitored.
您监控文件夹并通过向其中添加新文件来更改其大小,因此您会收到事件通知。
所以很自然地,当您在文件系统上来回移动文件时,您可能会遇到一系列不同的事件。您只需要阅读从事件中获得的 属性 并采取相应的行动即可。
我 运行 刚刚进入这个问题,这个页面是第一个搜索结果之一 - 我知道这是一个较旧的问题,但由于没有确凿的答案,我会冒昧地添加我的解决方案. 我看到的具体行为是,在创建文件时,FileSystemWatcher 触发了 Change 和 Create 事件。
例如如果我在命令提示符下键入:
echo test >foobar.txt
..然后我的 FSW 为 foobar.txt 的 Change 开火,然后 Creation 文件。虽然技术上是正确的,如上面 Tig运行 所解释的,但我真的只对向用户呈现 Create 事件感兴趣。
我的解决方案很简单。我创建了一个布尔标志来指示 FSW 事件处理程序是否已触发,并在 Create 事件发生时将其设置为 TRUE。我修改了 Change 事件处理程序,使其仅在标志设置为 false 时才执行操作。 换句话说,每个周期只处理一个事件(在我的例子中,当用户点击一个按钮确认事件时,标志被重置)并且优先考虑创建事件。
我希望这对遇到同样挑战的其他人有所帮助。
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;
}