2011-07-08 9 views
1

これは私が以前質問した質問に適用されます。私はファイルを監視し、ファイルの変更が止まった場合に警告するアプリケーションを作成しようとしています。誰かがファイルサイズをチェックし、Windowsサービスでタイマーを使用することを推奨しました。私は彼らのアドバイスをしましたが、私はWindowsサービスにはあまりよくありません。私は作成した2つのファイルのファイル比較をしようとしています。以下は、私が把握することはできませんがtimer_elapsed方法でS1を参照する方法であるコードC#ファイルの監視

public partial class Service1 : ServiceBase 
{ 
    Timer timer1 = new Timer(); 
    string filePath = @"C:\Users\Test\Desktop\New folder\Test.txt"; 
    string logPath = @"C:\Users\Test\Desktop\New folder\Log.txt"; 
    string newLog = @"C:\Users\Test\Desktop\New folder\Log1.txt"; 


    public Service1() 
    { 
     InitializeComponent(); 
    } 

    public void OnStart(string[] args) 
    {    
     timer1.Elapsed += new ElapsedEventHandler(timer1_Elapsed); 
     timer1.Interval = 60000; 
     timer1.Enabled = true; 
     timer1.AutoReset = true; 
     timer1.Start(); 

     FileInfo f = new FileInfo(filePath); 
     long s1 = f.Length; 

     using (StreamWriter file = new StreamWriter(logPath)) 
     { 
      file.WriteLine(s1.ToString()); 
     } 
    } 

    protected override void OnStop() 
    { 
     timer1.Enabled = false; 
    } 

    public void timer1_Elapsed(object sender, ElapsedEventArgs e) 
    { 
     FileInfo f = new FileInfo(filePath); 
     long s2 = f.Length; 

     using (StreamWriter file = new StreamWriter(newLog)) 
     { 
      file.WriteLine(s2.ToString()); 
     } 
    } 
} 

です。私はそれを世界的に宣言しようとしましたが、うまくいかないでしょう。私はちょうどタイマー経過メソッドでこれを行うことができるようにしたいです。

 if (s1 == s2) 
     { 
      //send email 
     } 

     else 
     { 
      //don't do anything 
     } 

アドバイスをいただければ幸いです。

+0

?あなたがそれを試みたとき、正確に 'うまくいかなかったのは何ですか? –

+0

正しい。エラーは、 "フィールド初期化子が非静的なフィールド、メソッド、またはプロパティを参照できませんでした。" – Matt

+0

ファイルが成長を停止したときとファイルの成長が一時停止したときを判断するロジックは何ですか? – JohnFx

答えて

2

ちょうどこのようにそれを実行します。私はあなたがクラスのフィールドとして宣言しようとした意味を前提と

public partial class Service1 : ServiceBase 
{ 
    Timer timer1 = new Timer(); 
    string filePath = @"C:\Users\Test\Desktop\New folder\Test.txt"; 
    string logPath = @"C:\Users\Test\Desktop\New folder\Log.txt"; 
    string newLog = @"C:\Users\Test\Desktop\New folder\Log1.txt"; 
    long oldFileSize; // Add this line 

    public void OnStart(string[] args) 
    {    
     timer1.Elapsed += new ElapsedEventHandler(timer1_Elapsed); 
     timer1.Interval = 60000; 
     timer1.Enabled = true; 
     timer1.AutoReset = true; 
     timer1.Start(); 

     FileInfo f = new FileInfo(filePath); 
     oldFileSize = f.Length; // change this line 

     using (StreamWriter file = new StreamWriter(logPath)) 
     { 
      file.WriteLine(s1.ToString()); 
     } 
    } 

    public void timer1_Elapsed(object sender, ElapsedEventArgs e) 
    { 
     FileInfo f = new FileInfo(filePath); 
     long s2 = f.Length; 

     using (StreamWriter file = new StreamWriter(newLog)) 
     { 
      if (s2 == oldFileSize) 
      { 
       // Send Email 
      } 
      file.WriteLine(s2.ToString()); 
     } 
    } 
+0

それは素晴らしい作品です。ありがとうございました – Matt

2

FileSystemWatcherクラスが必要です。 NotifyFilter/Path/IncludeSubdirectoriesの設定があります。

また、このクラスは、Changed、Created、Deleted、Renamedの一連のイベントを発生させます。

http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx

+2

ファイルのSTOPSがいつ成長するのかを知るのに役立ちますか? –

+0

の選択肢は、ポーリング(タイマー付きのループ)またはここで示唆するようにイベントをトリガーとして使用します。私には、イベントはちょうどきれいで、より柔軟です。それが成長を止めると、どちらのアプローチでも問題になる可能性があります。何分もかけて成長するものこの場合、しきい値を設定することができます(10分間は何もしない)、フィーダプロセスからの信号を要求する必要があります。例えばフィーダープロセスはファイルfileName.ext.started fileName.ext.completeを作成します。ここではいくつかの前提があります。シナリオの詳細を知る必要があります。 – sgtz

+0

btw:あなたは受け入れられた答えについてもその質問をすることができます。 – sgtz

関連する問題