0

log.txtwithを作成して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)
    {
    }
}
4

2 に答える 2

6

File.Create は、作成後に開かれるファイルストリームを作成します。そのため、ファイルは独自のプロセスで使用されます。

に変更するだけです

        using(var f = File.Create(Path.Combine(PATH, NAME))) { } ;
于 2012-09-25T06:39:02.610 に答える
3

File.Create型の戻り値がありFileStreamます。何にも使用するつもりがない場合は、d (または d) にする必要がありFileStreamますCloseDispose

ただし、ログ ファイルの場合は、通常、パラメーターを受け取るコンストラクターの 1 つを使用して、オブジェクトをFileStream構築することにより直接作成します。そうすれば、ストリームを開いたままにしておくことができますが、他のプログラムが読み取り用に開くことができる必要があることを示します。FileStreamFileShare

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
于 2012-09-25T06:40:00.893 に答える