4

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

但是当应用程序 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

4 回答 4

4

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

应用一:

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);
}
于 2013-08-20T19:24:56.983 回答
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 + " <");
    }
});
于 2013-08-20T19:33:04.647 回答
1

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

于 2013-08-20T19:27:40.233 回答
-1

您需要从程序 A 中释放对文件的控制权。完成后尝试关闭或处置流写入器。

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

于 2013-08-20T19:10:39.433 回答