无法从新创建的.txt中读取。它被另一个进程使用

时间:2012-09-25 06:37:00

标签: c# visual-studio-2010 file file-io

当我使用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)
    {
    }
}

2 个答案:

答案 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