我如何使用 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 触发了 ChangeCreate 事件。

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

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