2016-12-01 11 views
2

FileSystemWatcher:ディレクトリ内の新しいファイルに対してのみイベントを発生させる方法は?FileSystemWatcher:ディレクトリ内の新しいファイルに対してのみイベントを発生させる方法は?

私のサービスでスキャンするディレクトリがあります。そして、私はFileSystemWatcher使用:

コンストラクタ:

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";     
     }      
} 

しかし、問題は、新しいファイルを作成します(またはコピーしたときに、私は、イベントを取得したいということです。そして、

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

を、私はディレクトリにサブスクライブ)。 代わりに、このディレクトリ内のすべてのファイルからのイベントが既に存在します。

新しいファイルからのみイベントを取得するにはどうすればよいですか? ありがとうございました!

+0

あなたのコードは私にとって役立ちます。新しく作成されたファイルのみを通知します。それは '創造'イベントがやろうとしていることです。 – user3185569

+0

答えがあなたの問題を解決しましたか?はいの場合は、答えとしてマークすることを忘れないでください。 –

答えて

4

NotifyFilterからNotifyFilters.FileName | NotifyFilters.CreationTime | NotifyFilters.LastWriteに設定すると、新しいファイルが作成されたかどうかを確認できます。

変更イベントが発生した後に発生イベントでe.ChangeType == WatcherChangeTypes.Createdもチェックする必要があります。

+1

'OnChanged'として' OnCreated'イベントの名前をつけていますが、 'FileSystemWatcher'クラスに' Changed'というイベントがありますが、ちょっと混乱します! – user3185569

+0

'e.ChangeType'がキーです。いい物! – RBT

2

私が気付いたことに、ファイルを編集するときに発生するイベントは、ファイルを編集するアプリケーションによって大きく異なる場合があります。

一部のアプリケーションは上書きされ、他のアプリケーションは追加されます。

これまでのポーリングでは、以前のポーリングで既に存在していたファイルのリストを保持することは、イベントを正しく取得しようとするよりも信頼性が高いことがわかりました。

+0

OPはディレクトリに新しいファイルの作成を見たいと思う。追加と上書きはファイルの更新に関連しています。 – RBT

+1

@ RBT - 一部のアプリケーションでは、ファイルを修正するときに元のファイルを削除し、同じファイルに新しいコンテンツを書き込むことがあります。 OSでは、これは新しいファイルのように見え、新しいファイルイベントを発生させます。 –

+0

Ohh。それは非常に興味深い発見です。 – RBT