2013-01-02 115 views
-5

我有一個c#代碼,我需要在點擊按鈕後在txt文件中記錄信息。該文件被創建,但寫方法拋出一個異常錯誤:該進程無法訪問文件'D: test.txt'

Write方法:

public static void writelogfile(string text) 
{ 
    StreamWriter sw = logfile.AppendText(); 
    sw.WriteLine(text); 
    sw.Close(); 
} 

文件創建方法:

string filename = "loging-" + DateTime.Now.ToString("yyyyMMdd-HHmmss") + ".txt"; 
logfile = new FileInfo("D:Log\\" + filename); //for QA 
logfile.Create(); 

的方法,用於記錄信息的實際行:

writelogfile("userid: " + id); 

該進程無法訪問文件'D:test.txt',因爲它正在被其他進程使用的 。 System.IO.__ Error.WinIOError(Int32 errorCode,String maybeFullPath)System.IO.FileStream.Init(String path,FileMode mode,FileAccess access,Int32 rights,Boolean useRights,FileShare share,Int32 bufferSize,FileOptions選項, SECURITY_ATTRIBUTES secAttrs,字符串MSGPATH,布爾bFromProxy)在 System.IO.FileStream..ctor(字符串路徑,的FileMode模式,FileAccess的 訪問,文件共享份額,緩衝區大小的Int32,FileOptions選項,字符串 MSGPATH,布爾bFromProxy)在系統.IO.FileStream..ctor(字符串 路徑,FileMode模式,FileAccess訪問,FileShare共享,Int32 bufferSize,FileOptions選項) System.IO.StreamWriter..ctor(String path,Boolean append,Encoding 編碼的Int32 BUFFERSIZE)在System.IO.StreamWriter..ctor(字符串 路徑,布爾附加)在System.IO.FileInfo.AppendText()在 Blocked_listupdate.VisualWebPart1.VisualWebPart1UserControl.writelogfile(字符串 文本)在 Blocked_listupdate .VisualWebPart1.VisualWebPart1UserControl。 <> c_ DisplayClass1.b _0() at Microsoft.SharePoint.SPSecurity。 <> C_ DisplayClass4.b _2()在處 Microsoft.SharePoint程序 Microsoft.SharePoint.SPSecurity.RunWithElevatedPrivileges(WaitCallback 安全碼,對象PARAM) Microsoft.SharePoint.Utilities.SecurityContext.RunAsProcess(CodeToRunElevated 安全碼)。 SPSecurity.RunWithElevatedPrivileges(CodeToRunElevated 的SecureCode)在 Blocked_listupdate.VisualWebPart1.VisualWebPart1UserControl.btnupdate_Click(對象 發件人,EventArgs的)

+3

我在家裏忘了我的晶球。請分享您的代碼.. –

+3

也許是因爲它正在被另一個進程使用。另一個應用程序或者你有一個打開的文件句柄D:\ test.txt。 – Matten

+0

Matten的評論使得聽起來像tulajaram創建文件的方式不會放開文件。通過代碼,我們可以指出你出錯的地方。 – krillgar

回答

1

你說的文件被創建,但我怎麼看不到?給定以下行

logfile = new FileInfo("D:Log\\" + filename); //for QA 

該路徑無效 - 冒號後需要反斜槓。如果你喜歡,你也可以用@作爲前綴,這樣你就不需要雙反斜槓。

例如:

var file = new FileInfo(@"D:\Log\Something" + filename); 

此外,你的錯誤堆棧跟蹤不發佈的代碼相匹配的文件名應具有內它的日期時間,如果你的代碼是什麼去了。堆棧跟蹤是顯示該文件的名稱爲test.txt

只要沒有其他問題,糾正路徑應該解決問題。

+0

對不起..我認爲沒有正確複製代碼,,,該文件將被創建沒有問題,但當它去到行 StreamWriter sw = logfile.AppendText(); 它會引發錯誤 –

0

這IOException異常......

該進程無法訪問該文件「d:test.txt的」作爲例外說,因爲它正被另一個進程使用

..是的因爲你試圖使用已經有鎖的文件。您可以使用查找句柄或DLL的ProcessExplorer來確定哪個進程有鎖。

最有可能的ProcessExplorer會告訴你它的兩件事情之一

  1. 你一些文件工具檢查日誌,而你試圖登錄到它。
  2. 它的你的應用程序有鎖。這意味着,不只一個線程正在寫入日誌。由於這是在Sharepoint託管的,如果兩個請求試圖記錄錯誤,就可能發生這種情況。

如果它的第一個答案是非常直接關閉導致問題的應用程序。

如果它的第二個,懷疑是因爲你的意見它有時記錄,但有時我得到了錯誤你有幾個選項。最簡單的就是在寫入時只是阻止

私有隻讀對象logLock = new object();

public static void writelogfile(string text) 
{ 

    lock(myLock) 
     { 
      //Using instead of close in case there's an error with WriteLine 
      using(StreamWriter sw = logfile.AppendText()) 
      { 
      sw.WriteLine(text); 
      } 
     } 
} 

問題是,如果出現大量日誌記錄發生的主要問題,所有請求都必須等待日誌記錄。

另一種方法是在後臺線程中寫入文件,但要刪除IO爭用。例如,您可以寫入隊列,並定期檢查隊列並將隊列刷新到日誌。

0

通過使用logfile.Create(); StreamWriter創建。您需要關閉流寫入器(或使用它創建的寫入器),否則您將遇到兩個嘗試寫入同一文件的StreamWriters的問題。

只需將logfile.Create()更改爲using(logfile.Create()){}並且應該處置新創建的StreamWriter。或者,您可以將sw分配給Create()方法,然後將其傳遞給writelogfile()方法:StreamWriter sw = logfile.Create()

相關問題