2012-04-10 14 views
3

特定のディレクトリ内の新しい/既存のファイルが見つかった/作成された場合に発生する必要があるカスタムイベントが必要です。新しいファイルが作成されたかどうかを確認するには、SystemFileWatcherを使用します。これはうまくいきます。プログラムの開始時にいくつかのファイルが存在するかどうかを調べるために、私はいくつかの行を書きました。 SystemFileWatcherはFileCreatedイベントを発生させる場合は、私はこれらのコード行を使用カスタムイベントを正しく呼び出す方法は?

public class FileDetectEventArgs : EventArgs 
{ 
    public String Source { get; set; } 
    public String Destination { get; set; } 
    public String FullName { get; set; } 

    public FileDetectEventArgs(String source, String destination, String fullName) 
    { 
     this.Source = source; 
     this.Destination = destination; 
     this.FullName = fullName; 
    } 
} 

public void onFileCreated(object sender, FileSystemEventArgs e) 
{ 
    // check if file exist 
    if (File.Exists(e.FullPath)) 
    { 
     OnNewFileDetect(new FileDetectEventArgs(source, destination, e.FullPath)); 
    } 
} 

をして、ファイルが存在する場合は、私が提起してみてください

私はイベント引数のために、このクラスを使用しますその方法でのイベント:ここ

public void checkExistingFiles(String source, String filter) 
    { 
     DirectoryInfo di = new DirectoryInfo(source); 
     FileInfo[] fileInfos = di.GetFiles(); 
     String fileFilter = filter.Substring(filter.LastIndexOf('.'));  

     foreach (FileInfo fi in fileInfos) 
     { 
      if (fi.Extension.Equals(fileFilter)) 
      { 
       OnNewFileDetect(new FileDetectEventArgs(source, destination, fi.FullName));     
      } 
     } 
    } 

はOnNewFileDetect-イベントです:

protected void OnNewFileDetect(FileDetectEventArgs e) 
    { 
     if (OnNewFileDetectEvent != null) 
     { 
      OnNewFileDetectEvent(this, e); 
     } 
    } 

問題は、onFileCreated-Eventが私のOnNewFileDetect-Eventを呼び出すと問題なく動作します。しかし、checkExistingFilesが既存のファイルをいくつか見つけて、OnNewFileDetect-Eventを発生させようとすると何も起こりません。 OnNewFileDetectEvent-Objectがnullであることを知り、何も起こりません。しかし、onFileCreated-Eventが起動された場合、なぜnullではないのですか?

答えて

2

But why its not null if the onFileCreated-Event is fired?

このイベントは、何かイベントを購読するまではnullになります。サイドノートでは


は、私がイベントを上げるだけでなく、ここでは標準のC#/。NETネーミングを使用するためのより良いパターンへの切り替えを検討したいです。これはもっと似ています:

// The event... 
public EventHandler<FileDetectedEventArgs> NewFileDetected; 

// Note the naming 
protected void OnNewFileDetected(FileDetectedEventArgs e) 
{ 
    // Note this pattern for thread safety... 
    EventHandler<FileDetectedEventArgs> handler = this.NewFileDetected; 
    if (handler != null) 
    { 
     handler(this, e); 
    } 
} 
+0

ありがとうございました。 エラーが表示されます:デリゲート "FileDetecedEvent"は2つの引数を取らない – thomas

+0

@thomasイベントはどのように宣言されていますか? –

+0

パブリックデリゲートvoid FileDetectEvent(オブジェクト送信者、FileDetectedEventArgs e); @Reed Copsey – thomas

1

@Reed Copseyは質問に答えました。サブスクライバーがあるまでイベントはnullになります。

また、これは潜在的な競合状態です:

if (OnNewFileDetectEvent != null) 
{ 
    OnNewFileDetectEvent(this, e); 
} 

OnNewFileDetectEventif文の後nullに設定されている場合、マルチスレッドのシナリオでは、ということが、次の行に呼び出しの前に、あなたのプログラムはクラッシュします。一般的に、あなたはこれを行うだろう:

var del = OnNewFileDetectEvent; 
if (del != null) 
{ 
    del(this, e); 
} 

をあなたのイベントオブジェクトは、それがif文でnullでない場合はnullになることはありませんdel不変です。

また、あなたの命名は自由であることにも注意してください。イベントのプレフィックスは通常Onではないため、イベントを呼び出すメソッドはです。

+0

ありがとう、ありがとう、しかし、なぜ私は今、エラー:デリゲート "FileDetecedEvent"は2つの引数を取る – thomas