FileSystemWatcher的NotifyFilter无法正常工作

时间:2012-12-04 17:53:50

标签: windows windows-services filesystemwatcher

我有一个Windows服务(并通过创建类似的WinForms应用程序验证了代码),其中NotifyFilter不起作用。一旦删除该行代码,该服务就可以正常工作,我可以在WinForms应用程序中看到事件处理程序触发。

我正在做的就是将文本文件放入输入目录中,以便FileSystemWatcher启动watcher_FileChanged委托。当我在那里_watcher.NotifyFilter = NotifyFilters.CreationTime;时,它不起作用。当我把它拉出来时,它工作正常。

有人能告诉我这个过滤器是否有问题吗?

以下是OnStart事件的FSW代码。

protected override void OnStart(string[] args)
{
    _watcher = new FileSystemWatcher(@"C:\Projects\Data\Test1");

    _watcher.Created += new FileSystemEventHandler(watcher_FileChanged);
    _watcher.NotifyFilter = NotifyFilters.CreationTime;
    _watcher.IncludeSubdirectories = false;
    _watcher.EnableRaisingEvents = true;
    _watcher.Error += new ErrorEventHandler(OnError);    
}

private void watcher_FileChanged(object sender, FileSystemEventArgs e)
{
    // Folder with new files - one or more files
    string folder = @"C:\Projects\Data\Test1";
    System.Console.WriteLine(@"C:\Projects\Data\Test1");
    //Console.ReadKey(true); 

    // Folder to delete old files - one or more files
    string output = @"C:\Temp\Test1\";
    System.Console.WriteLine(@"C:\Temp\Test1\");
    //Console.ReadKey(true);

    // Create name to call new zip file by date
    string outputFilename = Path.Combine(output, string.Format("Archive{0}.zip", DateTime.Now.ToString("MMddyyyy")));
    System.Console.WriteLine(outputFilename);
    //Console.ReadKey(true);

    // Save new files into a zip file
    using (ZipFile zip = new ZipFile())
    {
        // Add all files in directory
        foreach (var file in Directory.GetFiles(folder))
        {
            zip.AddFile(file);
        }

        // Save to output filename
        zip.Save(outputFilename);
    }

    DirectoryInfo source = new DirectoryInfo(output);
    // Get info of each file into the output directory to see whether or not to delete
    foreach (FileInfo fi in source.GetFiles())
    {
        if (fi.CreationTime < DateTime.Now.AddDays(-1))
            fi.Delete();
    }
}

2 个答案:

答案 0 :(得分:3)

我也遇到过这种行为的麻烦。如果您单步执行代码(如果查看MSDN documenation,则会发现NotifyFilter的默认值为:{/ p>

NotifyFilters.FileName | NotifyFilters.DirectoryName | NotifyFilters.LastWrite

所以,当你说.NotifyFilter = NotifyFilters.CreationTime时,你正在消除那些其他值,这解释了行为的差异。我不确定为什么NotifyFilters.CreationTime没有抓住新文件...似乎应该,不应该!“

如果它适用于您,您可以使用NotifyFilter的默认值。如果你想添加NotifyFilters.CreationTime,我建议你做这样的事情来添加新值而不是替换现有值:

_watcher.NotifyFilter = _watcher.NotifyFilter | NotifyFilters.CreationTime;

答案 1 :(得分:0)

我知道这是一篇旧帖子,但文件创建时间并不总是可靠的。我遇到了一个问题,即将日志文件移动到存档文件夹并在其中创建了一个同名的新文件但是文件创建日期没有改变,实际上元数据是从前一个文件中保留的(移动到存档的那个)。

Windows在文件的某些属性上有此缓存,包含文件创建日期。您可以在这里阅读文章:https://support.microsoft.com/en-us/kb/172190