2

これが重複した質問である場合は、謝罪することから始めます。FileSystemWatcher に関する質問は山ほどありましたが、私の問題に対処するものは見当たりませんでした。

わかりましたので、C# でディレクトリを監視するコンソール アプリケーションを作成しましたRootRoot多くのサブフォルダーがあります。このアプリケーションの目的は、またはRootそのサブフォルダー内で .csv ファイルが作成、変更、または削除された場合に、ログ ファイルに書き込むことです。私は現在、これをうまく機能させています。唯一の問題は、.csv ファイルが作成、変更、または削除されると、実際には 3 つすべてのイベントが発生することです。

たとえば、Rootcalledtest.csvでファイルを作成すると、ログ ファイルは次のようになります。

 10/04/2012: File F:/Root/test.csv Created
 10/04/2012: File F:/Root/test.csv Changed
 10/04/2012: File F:/Root/test.csv Created
 10/04/2012: File F:/Root/test.csv Deleted

何が起こっているのかわからないので、ここに設定するコードがありますFileSystemWatcher

 _watchFolder.Path = ConfigurationManager.AppSettings["RootToWatch"];
 _watchFolder.Filter = ConfigurationManager.AppSettings["FileNameToWatch"];
 _watchFolder.NotifyFilter = NotifyFilters.FileName 
                             | NotifyFilters.LastWrite;
 _watchFolder.IncludeSubdirectories = true;
 _watchFolder.Changed += new FileSystemEventHandler(OnChanged);
 _watchFolder.Created += new FileSystemEventHandler(OnChanged);
 _watchFolder.Deleted += new FileSystemEventHandler(OnChanged);
 _watchFolder.Renamed += new RenamedEventHandler(OnRenamed);

 try
 {
     _watchFolder.EnableRaisingEvents = true; 
 }
 catch (ArgumentException ex)
 {
     AbortMonitoring(ex.Message);
 }

そして、ここに私のOnChangedイベントがあります(名前変更は同じですが、引数が異なります)

  protected static void OnChanged(object sender, FileSystemEventArgs e)
    {
        //compile message to insert into log file.
        string message = "File: " + e.FullPath + " " + e.ChangeType;
        UpdateLogFile(message);
    }
4

1 に答える 1

0

イベント専用のハンドラを追加するだけですchanged。すべての変更タイプを収集する必要があります。created特定の変更タイプでのみイベントを発生させたい場合は、他のタイプのイベントがあります。

watchFolder.IncludeSubdirectories = true;
_watchFolder.Changed += new FileSystemEventHandler(OnChanged);
于 2012-10-04T16:54:59.550 に答える