2

我有一个 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();
    }
}
4

2 回答 2

3

这种行为我也遇到了麻烦。如果您单步执行代码(并且如果您查看MSDN 文档,您会发现它NotifyFilter以以下默认值开始:

NotifyFilters.FileName | NotifyFilters.DirectoryName | NotifyFilters.LastWrite

因此,当您说 时.NotifyFilter = NotifyFilters.CreationTime,您正在消除其他值,这解释了行为上的差异。我不确定为什么NotifyFilters.CreationTime没有捕获新文件……似乎应该,不应该!

NotifyFilter如果它对您有用,您可能只使用默认值。如果要添加NotifyFilters.CreationTime,我建议您执行以下操作来添加新值而不是替换现有值:

_watcher.NotifyFilter = _watcher.NotifyFilter | NotifyFilters.CreationTime;
于 2013-05-22T15:27:05.610 回答
0

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

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

于 2016-09-13T17:00:56.570 回答