当我使用log.txt
创建File.Create(Path.Combine(PATH, NAME));
然后尝试从中读取时,我会收到例外:{System.IO.IOException: The process cannot access the file 'c:\temp\log.txt' because it is being used by another process.
。
如果log.txt
文件退出但未在方法中创建,我可以在没有任何问题的情况下读取和写入日志。
log.txt
是否已创建异步,问题是程序在创建之前是否尝试读取它?
public static void WriteToLog(string text)
{
try
{
if (!Directory.Exists(PATH))
{
Directory.CreateDirectory(PATH);
}
if( !File.Exists(Path.Combine(PATH, NAME)) )
{
File.Create(Path.Combine(PATH, NAME));
}
var logLines = File.ReadAllLines(Path.Combine(PATH, NAME)).ToList<string>();
logLines.Insert(0, "-------------------------------------------------End New Log");
logLines.Insert(0, text);
logLines.Insert(0, "-------------------------------------------------Start New Log");
File.WriteAllLines(Path.Combine(PATH, NAME), logLines);
}
catch (Exception ex)
{
}
}
答案 0 :(得分:6)
File.Create创建一个文件流,在创建后打开。所以该文件由其自己的进程使用。
将其更改为
using(var f = File.Create(Path.Combine(PATH, NAME))) { } ;
答案 1 :(得分:3)
File.Create
的返回值为FileStream
。如果您不打算将其用于任何事情,则FileStream
应为Close
d(或Dispose
d)。
但是,对于日志文件,我通常会通过使用接受FileStream
参数的constructors之一构建FileStream
对象来直接创建FileShare
。这样,您可以保持流打开,但表明其他程序应该能够打开它进行阅读:
var fs = new FileStream(Path.Combine(PATH, NAME),
FileMode.OpenOrCreate,
FileAccess.Write,
FileShare.Read); //Now other people can access the log file whilst I'm still writing to it