0

2 つのアプリケーションがあり、1 つはファイルへの書き込み、もう 1 つはファイルの読み取りです。これはログ ファイルであるため、ライターはプログラムが停止するまでログを記録しますが、リーダーはファイルの内容を取得するためにいつでも呼び出すことができます。

ライターが FileShare.Read でファイルを開くと、リーダーはファイルにアクセスできると思っていたのですが、ファイルが別のプロセスによって使用されているというエラーが発生します。

ライター アプリケーション:

FileStream fs = new FileStream("file.log", FileMode.Open, FileAccess.Write, FileShare.Read); BinaryWriter writer = new BinaryWriter(fs);

リーダー アプリケーション:

BinaryReader リーダー = 新しい BinaryReader(File.OpenRead("file.log"));

このエラーを防ぐにはどうすればよいですか?

4

2 に答える 2

0

o FileStream に追加のフラグを提供する必要があるロックされたファイルを読み取ります。

以下のようなコード。

using (var reader = new FileStream("d:\\test.txt", FileMode.Open, FileAccess.Read,FileShare.ReadWrite))
{
            using (var binary = new BinaryReader(reader))
            {
                //todo: add your code
                binary.Close();
            }
            reader.Close();
}

これにより、読み書きの共有モードで読み取り専用でファイルが開かれます。これは小さなアプリでテストできます。(バイナリの代わりに streamreader\write を使用)

    static Thread writer,
                  reader;

    static bool abort = false;

    static void Main(string[] args)
    {

        var fs = File.Create("D:\\test.txt");
        fs.Dispose();

        writer = new Thread(new ThreadStart(testWriteLoop));
        reader = new Thread(new ThreadStart(testReadLoop));
        writer.Start();
        reader.Start();

        Console.ReadKey();
        abort = true;
    }

    static void testWriteLoop()
    {
        using (FileStream fs = new FileStream("d:\\test.txt", FileMode.Open, FileAccess.Write, FileShare.Read))
        {
            using (var writer = new StreamWriter(fs))
            {
                while (!abort)
                {
                    writer.WriteLine(DateTime.Now.ToString());
                    writer.Flush();
                    Thread.Sleep(1000);
                }
            }
        }
    }

    static void testReadLoop()
    {
        while (!abort)
        {
            Thread.Sleep(1000);
            using (var reader = new FileStream("d:\\test.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
            {
                using (var stream = new StreamReader(reader))
                {
                    Console.WriteLine(stream.ReadToEnd());
                    stream.Close();

                }
                reader.Close();
            }
        }
    }

上記の例は非常に単純ですが、「testWriteLoop」がロックを解放しないという事実は依然として残っています。

お役に立てれば

于 2013-07-30T02:53:41.527 に答える