FileMode和FileAccess以及IOException:进程无法访问文件';filename';因
本文关键字:访问 文件 filename FileAccess 以及 IOException 进程 FileMode | 更新日期: 2023-09-27 18:28:19
我有一个应用程序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);
}
您需要确保服务和读取器都以非独占方式打开日志文件。注意应用程序A第2行和应用程序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中释放对文件的控制。完成后请尝试关闭或处理streamwriter。
或者,您可以尝试using
,如此问题的答案所述:释放对文件的访问权限