potisanのプログラミングメモ

趣味のプログラマーがプログラミング関係で気になったことや調べたことをいつでも忘れられるようにメモするブログです。はてなブログ無料版なので記事の上の方はたぶん広告です。記事中にも広告挿入されるみたいです。

C# 9 チェックディスクのイベントログをボリュームラベルで分類して取得する

チェックディスクのイベントログをボリュームラベルで分類して取得する方法です。

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text.RegularExpressions;

const int CheckDiskInstanceID = 0x400003e9;

// ボリュームラベルの正規表現
var re_volume = new Regex("^\r\n\r\nChecking file system on (?<VolumeLabel>\\S?):\r\n");

var log = new EventLog("Application", ".", "Wininit");
var entries = log.Entries.Cast<EventLogEntry>()
    .Where(entry => entry.InstanceId == CheckDiskInstanceID);

// ボリュームラベルとエントリーの辞書
var dict = new Dictionary<char, List<EventLogEntry>>();
foreach (var entry in entries)
{
    var m = re_volume.Match(entry.Message);
    if (m.Success)
    {
        var key = m.Groups["VolumeLabel"].Value[0];
        if (!dict.ContainsKey(key))
        {
            dict.Add(key, new ());
        }
        dict[key].Add(entry);
    }
}

// TODO: ここでボリュームラベルとエントリーの辞書を処理します。
// ここでは作成日時が最新の情報を一覧表示します。
foreach (var key in dict.Keys.OrderBy(key => key))
{
    Console.WriteLine(dict[key].OrderByDescending(
        entry => entry.TimeGenerated).First().Message);
}

2021/3/10:この記事は別のブログで投稿した記事を移動したものです。