7

書き込まれているログ ファイルを定期的に読み取りたいと考えています。プログラムはログ ファイルの内容を定期的に読み取り、解析して値を抽出します。しかし、毎回ファイル全体を読みたくありません。

特定の行からファイルを読み取る方法はありますか?

たとえば、最初の読み取りでは、ファイルには 100 行あります。この値をメモし、次に読み取るときは 100 行目から読み取りを開始し、現在のファイルの行番号を保存します。

これを行う効率的な方法はありますか?ログ ファイルは約 100 MB まで大きくなり、約 5 秒ごとに読み取る必要があります。そのため、毎回完全なファイルを読み取るのはそれほど効率的ではありません。

どんな提案でも大歓迎です。

4

4 に答える 4

3

シークはこれをうまく行うことができます。しかし、私は他の方法を提供したいと考えています。

    public static void Read()
    {
        var fs = new FileStream(@"G:\test.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
        int lastReadCount = 0;
        while (true)
        {
            var totalCountOfFile = fs.Length;
            if (lastReadCount < totalCountOfFile)
            {
                var buffer = new byte[1024];
                int count = fs.Read(buffer, 0, buffer.Length);
                lastReadCount += count;
                Display(buffer);
            }
            Thread.Sleep(5000);
        }
    }

    private static void Display(byte[] buffer)
    {
        var text = Encoding.UTF8.GetString(buffer.Where(p=>p != 0).ToArray());
        Console.Write(text);
    }
于 2013-05-01T15:06:00.160 に答える
3

ログが追加されるだけの場合は、ロックなしで読み取り専用モードでファイルを開いてみることができます。そうすれば、あなたがそれを読んでいる間、他のプロセスがそれに書き込むことができます。

var fs = new FileStream(path,FileMode.Open,FileAccess.Read, FileShare.ReadWrite);
于 2013-05-01T13:44:42.083 に答える