FileSystemWatcher:如何仅为目录中的新文件引发事件?

时间:2016-12-01 07:20:15

标签: c# filesystemwatcher

FileSystemWatcher:如何仅为目录中的新文件引发事件?

我有一个目录,我的服务扫描。我使用FileSystemWatcher

构造

if(Directory.Exists(_dirPath))
{
    _fileSystemWatcher = new FileSystemWatcher(_dirPath);
}

然后,我订阅目录:

public void Subscribe()
{
    try
    {
        //if (_fileSystemWatcher != null)
        //{
        //    _fileSystemWatcher.Created -= FileSystemWatcher_Created;
        //    _fileSystemWatcher.Dispose();
        //}

        if (Directory.Exists(_dirPath))
        {                    
            _fileSystemWatcher.EnableRaisingEvents = true;
            _fileSystemWatcher.Created += FileSystemWatcher_Created;
            _fileSystemWatcher.Filter = "*.txt";                 
        }                    
}

但是,问题是我想在新文件创建(或复制)时获取事件。 相反,我从该目录中的所有文件中获取事件已经存在。

如何仅从新文件中获取事件? 谢谢!

2 个答案:

答案 0 :(得分:5)

通过将NotifyFilter设置为NotifyFilters.FileName | NotifyFilters.CreationTime | NotifyFilters.LastWrite,您可以查看是否已创建新文件。

您还需要在发生任何更改后检查引发事件中的e.ChangeType == WatcherChangeTypes.Created

static void Main(string[] args)
{
    FileSystemWatcher watcher = new FileSystemWatcher();
    string filePath = @"d:\watchDir";
    watcher.Path = filePath;
    watcher.EnableRaisingEvents = true;

    watcher.NotifyFilter = NotifyFilters.FileName | NotifyFilters.CreationTime | NotifyFilters.LastWrite;

    watcher.Filter = "*.*";
    watcher.IncludeSubdirectories = true;
    watcher.Created += new FileSystemEventHandler(OnFileCreated);

    new System.Threading.AutoResetEvent(false).WaitOne();
}

private static void OnFileCreated(object sender, FileSystemEventArgs e)
{
    if (e.ChangeType == WatcherChangeTypes.Created)
        // some code            
}

答案 1 :(得分:2)

根据经验,我注意到编辑文件时引发的事件可能会根据编辑文件的应用程序而有很大差异。

某些应用程序会覆盖,其他应用程序会附加。

我发现偶尔进行轮询并保留上一次民意调查中已经存在的文件列表比尝试正确的事件更可靠。