2011-08-03 3 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(); 
     } 
    } 

은 내가이 파일을 잃어버린 피하기 위해 무엇을 할 수 있는가? 나는 또한 시도했다

그러나 문제는 남아있다. 이 경우 함수를 통해 시작되고 프로세스가 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... 
관련 문제