FileMode和FileAccess和IOException:进程无法访问文件’filename’,因为它正由另一个进程使用

我有一个应用程序A,它生成一个用于跟踪的文本文件。
同时,应用程序B需要读取相同的文本文件并附加到邮件消息中。

但是当应用程序B尝试读取文本文件时,我收到以下错误:

IOException:进程无法访问文件’filename’,因为它正由另一个进程使用

有什么建议 ? 也许更好地用于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); } 

您需要确保服务和阅读器都非独占地打开日志文件。 注意App A的第2行和App B的第1行

申请A:

 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); } 

当然,您可以同时从同一个文件读取和写入(通过不同的线程/进程)。

这是一个示例代码。 只需看看如何创建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 + " <"); } }); 

您似乎没有使用StreamWriter类的Dispose()和Close()方法来释放文件。

您需要从程序A中释放对文件的控制权。尝试在完成时关闭或处理该编写器。

或者您可以尝试using此问题的答案中所述: 释放对文件的访问权限