2013-08-20 24 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 + " <"); 
    } 
}); 
相关问题