2013-08-20 107 views
1

我有一個使用簡單日誌記錄過程的程序。這個想法是,每天都會創建一個與日期相對應的新文件,除非文件已經存在,在這種情況下,它只是附加到文件中。問題是,File.Create每次運行時都會拋出一個錯誤。我找到了解決這個問題的方法,說File.Create打開一個FileStream,你只需要用.close()來調用它。但是這個解決方案對我不起作用,我仍然得到IO異常說該文件正在被另一個進程使用,這是不可能的,因爲它在File.Create創建它之前不存在,並且沒有其他用途使用這些文件。
下面的代碼:File.Create拋出IOException

public static void logResults(System.Reflection.MethodBase method, Results result, string message) 
    { 
     string date = DateTime.Now.ToString(); 
     int index = date.IndexOf(" "); 
     string subString = date.Substring(0, index); 
     string nwDate = Regex.Replace(subString, "/", ""); 
     logFileName = "WebsiteRegressionProduction_TestCycle." + nwDate; 
     string currentLogFile = logFileLocation + @"\" + logFileName; 
     StringBuilder sb = new StringBuilder(); 
     if (!File.Exists(currentLogFile)) 
     { 

      File.Create(currentLogFile).Close(); 
      sb.Append("DATE-TIME\tACTION\tTEST CLASS\tTEST NAME\tTEST STATUS\tERROR MESSAGES"); 
      sb.Append("\n"); 
     } 
     else 
     { 
      string previousLogs = File.ReadAllText(currentLogFile); 
      sb.Append(previousLogs); 
     } 
     sb.Append(DateTime.Now.ToString()); 
     sb.Append(" : "); 
     sb.Append("Text Executed: "); 
     sb.Append(method.ReflectedType.Name + " : "); 
     sb.Append(method + " : "); 
     sb.Append(result.ToString()); 
     sb.Append(" : "); 
     sb.Append(message); 
     sb.Append("\n"); 
     sb.Append("\n"); 

     File.WriteAllText(currentLogFile, sb.ToString());  
+0

我已經運行你的代碼,我看不到文件訪問的問題。發生異常的線是什麼? –

+0

這發生在File.Create行。 File.Create(currentLogFile);或 File.Create(currentLogFile).Close(); 拋出: IOException被用戶代碼未處理 該進程無法訪問文件「」,因爲它正在被另一個進程使用 –

+0

您確定currentLogFile路徑正確嗎?我有你的代碼,它應該工作得很好,只要路徑是有效的。異常方法是否提供更多信息? –

回答

1

File.AppendText可能是你正在試圖完成一個更好的選擇。它將創建該文件,如果它丟失並將文本添加到結尾。如果您想將標題添加到文件的開頭,那麼您只需快速手動檢查文件是否先存在。

0

1)爲什麼你閱讀所有以前的內容追加? 2)你可以簡單地使用log4net的是盡一切工作的「自由」

不過,我建議你使用流過的操作有更多的控制

FileStream fs = new FileStream(filePath, FileMode.Append); 
      byte[] data = Encoding.ASCII.GetBytes("The string you wanna append"); 
      fs.Write(data, 0, data.Length); 
      fs.Flush(); 
      fs.Close(); 

的FileMode.Append打開指定(filePath)在Append中是否存在,或者如果不存在則創建它。

0

File.Create返回的FileStream,所以你應該使用一個FileStream對象,像這樣:

FileStream fs = File.Create(currentLogFile); 

然後做你的讀/與FS對象寫入。

+0

當我實施您的更改。 FileStream fs = File.Create(currentLogFile); IOException被用戶代碼未處理 該進程無法訪問文件'\\ testfiler \ data \ files \ logFiles \ WebsiteRegressionProduction_TestCycle.8202013',因爲它正在被另一個進程使用 –

+0

如果我不得不冒險猜測。可能Visual Studio在某個地方創建了一個臨時文件,它是您新創建的文件的句柄,並且是實際上鎖定該文件的進程。我注意到在你的原始代碼中,你永遠不會關閉文件。作爲一個方面說明,WriteAllText實際上在一個命令(創建,寫入,關閉)中執行全部三個文件操作。我只是在這裏吐口水,因爲我現在無法訪問Visual Studio。 – microslop

1

從答案使用的建議,我已經改變了我的代碼。它在第一次創建文件時不會拋出異常,但當有人可以解釋爲什麼File.Create拋出一個IOException說文件已被使用且無法訪問時,我會將答案標記爲Accepted。

 public static void logResults(System.Reflection.MethodBase method, Results result, string message) 
    { 
     string date = DateTime.Now.ToString(); 
     int index = date.IndexOf(" "); 
     string subString = date.Substring(0, index); 
     string nwDate = Regex.Replace(subString, "/", ""); 
     logFileName = "WebsiteRegressionProduction_TestCycle." + nwDate; 
     string currentLogFile = logFileLocation + @"\" + logFileName; 
     if (!File.Exists(currentLogFile)) 
     { 
      File.WriteAllText(currentLogFile, 
       "DATE-TIME\tACTION\tTEST CLASS\tTEST NAME\tTEST STATUS\tERROR MESSAGES\n\n", Encoding.ASCII); 
     } 
     var sb = new StringBuilder(); 
     sb.Append(String.Format("{0} : Test Executed: {1} : {2} : {3}\n\n", DateTime.Now.ToString(), 
      method.ReflectedType.Name, method, message)); 
     using (var stream = File.AppendText(currentLogFile)) 
     { 
      stream.Write(sb.ToString()); 
     } 
    } 
+0

這實際上仍然在拋出一個錯誤,但只在執行程序的機器上;如果我在本地運行它,即使路徑保持不變,也不會出現錯誤... –

+1

聽起來像是您遇到權限問題:執行程序的用戶是否具有寫入權限?嘗試以管理員身份運行 另外,我建議你初始化StringBuilder的前面,並簡單地做一個sb.Append(yourHeaderText),而不是寫入文件兩次。 – User

相關問題