2

NotifyFilter が機能しない Windows サービスがあります (同様の WinForms アプリケーションを作成してコードを検証しました)。そのコード行を削除するとすぐに、サービスが正常に動作し、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 に答える