2011-08-03 26 views
0

新しいファイルのフォルダを監視するWindowsサービスを開発しました。私の問題は、例外が発生したときにサービスが機能しなくなることです。サービスの主な目的は: 1.ファイル作成のためのフォルダを見る 2.ファイルを読む 3.ファイルのデータをデータベースに挿入する 本当にやりたいことは、ファイルの挿入を緩めないことです!すべての新しいファイルを読み込み、そのデータをデータベースに挿入する必要があります。 "他のプロセスで使用されているため、 'c:\ newfile.txt'というファイルにアクセスできませんでした」などの例外が発生した場合、プロセスは停止します。Windowsサービスの例外 - 例外が発生したときにサービスが停止する

public partial class weatherService : ServiceBase 
    { 
     private FileSystemWatcher FSW; 
     private FswHandler Handler; 

     public weatherService() 
     { 
      InitializeComponent();    
     } 

     protected override void OnStart(string[] args) 
     { 
      FSW = new FileSystemWatcher("c:\\cvvv", "*.txt"); 
      Handler = new FswHandler(); 

      FSW.Created += Handler.OnEvent; 

      FSW.EnableRaisingEvents = true;  

     } 

     protected override void OnStop() 
     { 
      FSW.EnableRaisingEvents = false; 
      FSW.Dispose(); 
     } 

     protected override void OnPause() 
     { 
      FSW.EnableRaisingEvents = false; 
     } 

     protected override void OnContinue() 
     { 
      FSW.EnableRaisingEvents = true; 
     } 
    } 

そして、ハンドラのコードは次のとおりです:サービスのための私のコードがある

public class FswHandler 
    { 
     private string[] data; 
     private StreamReader reader; 
     private StreamWriter sw; 

     public void OnEvent(Object source, FileSystemEventArgs Args) 
     { 
      LogEvent(" [reading file] "); 
      readFile(Args.FullPath, Args.Name); 
     } 

     public void LogEvent(string msg) { 
      sw = new StreamWriter("C:\\Users\\Olga\\Desktop\\weatherlog.txt", true);  
      sw.WriteLine("Action : "+ msg +" occured in " + DateTime.Now.ToString()); 
      sw.Close(); 
     } 
     public void readFile(string path, string filename) 
     { 
      LogEvent(" [got in readFile] to read file " + filename); 
      try 
      { 
       reader = new StreamReader(path); 
      } 
      catch (Exception ex) 
      { 
       LogEvent(ex.Message); 
      } 
      try 
      { 
       reader = File.OpenText(path); 
      } 
      catch (Exception ex) 
      { 
       LogEvent(ex.Message); 
      } 
      string titlesLine; 
      string valuesLine; 

      LogEvent(" [getting 1st line] "); 

      titlesLine = reader.ReadLine(); 

      LogEvent(" [getting 2nd line] "); 

      valuesLine = reader.ReadLine(); 

      LogEvent(" [splitting 2nd line] "); 
      data = valuesLine.Split(new Char[] { ' ', '\t' }); 

      LogEvent(" [starting inserting] "); 
      insData(filename); 

      reader.Close(); 

     } 

     public void insData(string filename) { 
      string connString = "server=83.212.92.197;port=3306;database=mydata;uid=distusr;pwd=usdist1"; 
      MySqlConnection conn = new MySqlConnection(connString); 
      MySqlCommand command = conn.CreateCommand(); 

      DateTime cdt = System.DateTime.Now; 

      String.Format("{0:MM/dd/yyyy HH:mm:ss}", cdt); 
      string dt = cdt.ToString(); 
      int space_pos = dt.IndexOf(" "); 
      string date = dt.Substring(0, space_pos); 
      string time = dt.Substring(space_pos+1, dt.Length-space_pos+1); 

      command.CommandText = "INSERT INTO datainput(filename, measDate, measTime, out2, out3, out4, out5, out6, out7, out8, out9, out10," + 
      "out11, out12, out13, out14, out15, out16, out17, out18, out19, out20," + 
      "out21, out22, out23, out24, out25, out26, out27, out28, out29, out30," + 
      "out31, out32, out33, out34, out35, out36, out37, out38, out39, out40," + 
      "out41, out42, out43) VALUES ('" + filename + "','" + date + "','" + time + 
      "','" + data[14] + "','" + data[15] + "','" + data[16] + "','" + data[17] + "'," + 
      "'" + data[18] + "','" + data[19] + "','" + data[20] + "','" + data[21] + "','" + data[22] + 
      "','" + data[23] + "'," + "'" + data[24] + "','" + data[25] + "','" + data[26] + 
      "','" + data[27] + "','" + data[28] + "'," +"'" + data[29] + "','" + data[30] + 
      "','" + data[31] + "','" + data[32] + "','" + data[33] + "'," + "'" + data[34] + 
      "','" + data[35] + "','" + data[36] + "','" + data[37] + "','" + data[38] + "'," + 
      "'" + data[39] + "','" + data[40] + "','" + data[41] + "','" + data[42] + "','" + data[43] + 
      "'," + "'" + data[44] + "','" + data[45] + "','" + data[46] + "','" + data[47] + 
      "','" + data[48] + "'," + "'" + data[49] + "','" + data[50] + "','" + data[51] + 
      "','" + data[52] + "','" + data[53] + "','" + data[54] + "','" + data[55] + "')"; 

      LogEvent(" [opening database] "); 

      try{ 
       conn.Open(); 
      } 
      catch (Exception ex){ 
       LogEvent(ex.Message); 
      } 

      LogEvent(" [executing query] "); 

      try 
      { 
       command.ExecuteNonQuery(); 
      } 
      catch (Exception ex){ 
       LogEvent(ex.Message); 
      } 

      LogEvent(" [data have been inserted] "); 


      conn.Close(); 
     } 
    } 

私は、ファイルを失うことを避けるために何ができますか?私も試しました

 protected void DelayExecution(int nSeconds) 
     { 
      DateTime end = DateTime.UtcNow.AddSeconds (nSeconds); 
      while (DateTime.UtcNow < end){} 
     } 

     try 
     { 
      reader = File.OpenText(path); 
     } 
     catch (Exception ex) 
     { 
      LogEvent(ex.Message); 
      DelayExecution(2); 
      readFile(path, filename); 
     } 

しかし、問題は残ります。この場合、関数を介して処理が開始され、プロセスはdbにデータを挿入し、[1行目]に戻ります。 LogEventを使用してサービスをデバッグすることができます。なぜなら、私は非常に多くのLogEventを実行しているからです。

すべてのヘルプは素晴らしいことだ...

答えて

0

あなたはのThread.sleepをループ内で、この拡張メソッドを使用して試すことができます:

/// <summary> 
/// Extension methods for FileInfo 
/// </summary> 
public static class ExtensionMethods_FileInfo 
{ 
    /// <summary> 
    /// Verifies if the file is in use 
    /// </summary> 
    /// <param name="fi">Original FileInfo object</param> 
    /// <returns>Returns a boolean value with the state of the file</returns> 
    public static Boolean IsInUse(this FileInfo fi) 
    { 
     try 
     { 
      if (File.Exists(fi.FullName)) 
       File.Move(fi.FullName, fi.FullName); 
      return false; 
     } 
     catch (IOException) 
     { 
      return true; 
     } 
    } 
} 

私はあなたが伐採以外のコードを(書き込みしないことをお勧め)を「catch」セクションに追加してください。これは、さらなるエラーにつながる可能性があるためです。

while (new FileInfo(path).IsInUse()) 
    System.Threading.Thread.Sleep(1000); 

// Then do your job... 
関連する問題