2013-08-20 28 views
4

我有一個生成跟蹤文本文件的應用程序A.
雖然,應用程序B需要讀取相同的文本文件並附加到郵件消息中。FileMode和FileAccess和IOException:進程無法訪問文件'filename',因爲它正在被另一個進程使用

但我得到以下錯誤,當應用程序B試圖讀取該文本文件:

IOException異常:該進程無法訪問該文件「文件名」,因爲它 正在被另一個進程使用

有什麼建議嗎?也許更好地使用FileMode和FileAccess?

應用程序A

if (File.Exists(nFile2)) File.Delete(nFile2); 
       traceFile2 = File.Open(nFile2, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite); 
       if (traceFile2 != null) 
       { 
        var twt2 = new TextWriterTraceListener(traceFile2); 

        // http://www.helixoft.com/blog/archives/20 
        try 
        { 
         if (twt2.Writer is StreamWriter) 
         { 
          (twt2.Writer as StreamWriter).AutoFlush = true; 
         } 
        } 
        catch { } 

        var indiceTraceFile2 = Trace.Listeners.Add(twt2); 
        System.Diagnostics.Trace.WriteLine("INICIO: " + DateTime.Now.ToString()); 

應用B

using (FileStream fileStream = File.Open(f, FileMode.Open, FileAccess.ReadWrite, FileShare.Read)) 
        { 
         var messageAttachment = new Attachment(fileStream, Path.GetFileName(f)); 
         msgMail.Attachments.Add(messageAttachment); 
        } 

回答

4

你需要確保,無論是服務和讀者打開日誌文件的非排他性。通知行應用程序A和應用B的1號線2

應用答:

if (File.Exists(nFile2)) 
    File.Delete(nFile2); 
traceFile2 = new FileStream(nFile2, FileMode.Open, FileAccess.Write, FileShare.ReadWrite); 
if (traceFile2 != null) 
{ 
    var twt2 = new TextWriterTraceListener(traceFile2); 
    // http://www.helixoft.com/blog/archives/20 
    try 
    { 
     if (twt2.Writer is StreamWriter) 
     { 
      (twt2.Writer as StreamWriter).AutoFlush = true; 
     } 
    } 
    catch { } 

    var indiceTraceFile2 = Trace.Listeners.Add(twt2); 
    System.Diagnostics.Trace.WriteLine("INICIO: " + DateTime.Now.ToString()); 

和應用B:

using (FileStream fileStream = new FileStream(f, FileMode.Open, 
               FileAccess.Read, 
               FileShare.ReadWrite)) 
{ 
    var messageAttachment = new Attachment(fileStream, Path.GetFileName(f)); 
    msgMail.Attachments.Add(messageAttachment); 
} 
-1

你需要釋放從程序A.文件的控制嘗試關閉或處置的StreamWriter的,當你完成。

或在答案中描述了這個問題,你可能會嘗試usingReleasing access to files

+0

即使使用'FileShare.ReadWrite'? –

+0

看起來有些其他答案使這個無效。 – EZI

+0

由於App A正在運行,因此不會釋放應用程序A中的文件。兩個應用程序在同一時間運行。 – Kiquenet

1

看來你不使用的Dispose()和關閉()方法釋放該文件的StreamWriter類。

+1

由於App A正在運行,因此不會釋放應用程序A中的文件。兩個應用程序在同一時間運行。 – Kiquenet

2

當然,您可以同時讀取和寫入同一個文件(通過不同的線程/進程)。

這裏是一個示例代碼。只要看看如何創建FileStream

string fname = "a.txt"; 

//WRITER 
Task.Factory.StartNew(() => 
{ 
    var f = new FileStream(fname, FileMode.OpenOrCreate, FileAccess.Write, FileShare.ReadWrite); 
    var s = new StreamWriter(f); 
    long l = 0; 
    while (true) 
    { 
     s.WriteLine(l++); 
     s.Flush(); 
     Task.Delay(1000).Wait(); 
    } 
}); 


//READER 
Task.Factory.StartNew(() => 
{ 
    Task.Delay(1000).Wait(); 
    var f = new FileStream(fname, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 
    var s = new StreamReader(f); 

    while (true) 
    { 
     var line = s.ReadLine(); 
     if (line == null) { Task.Delay(100).Wait(); continue; }; 
     Console.WriteLine("> " + line + " <"); 
    } 
}); 
相關問題