プログラムの事とか

お約束ですが「掲載内容は私個人の見解です」

ファイルの変更をRxで監視する

前人の知恵がググると簡単にでてきます

qiita.com

まぁこれでホボ完成なんですが私はコンソールアプリで読み込むだけだったので、スケジューラー指定してとかそういうところを割愛

するとファイルの変更イベントが2回上がるようになりました

ほぼ同時なので2回目のイベントでのファイル読み込みは1回目の読み込みの影響でだいたい失敗します

これまたググる

stackoverflow.com

メモ帳の場合ファイルの保存で1回、属性の変更で1回ファイルを更新するよ、そしてこの動作は他のアプリでも同じだよ、的なことが書いてあるような気がします

今回は変更があったらファイルを読むとかその程度の動きができればいいのでThrottleで2回連続を1回にまとめました

private FileSystemWatcher _watcher;
private IDisposable _disposable;

public FileWatcher(string fileName)
{
    var file = new FileInfo(fileName);
    _watcher = new FileSystemWatcher();
    _watcher.Path = file.Directory?.FullName;
    _watcher.Filter = file.Name;
    _watcher.NotifyFilter = NotifyFilters.LastWrite;
    _disposable = Observable.FromEventPattern<FileSystemEventHandler, FileSystemEventArgs>(
        h => this._watcher.Changed += h,
        h => this._watcher.Changed -= h)
        .Throttle(TimeSpan.FromSeconds(.1))
        .Subscribe(e => this.ReadFile(e.EventArgs.FullPath));
    _watcher.EnableRaisingEvents = true;
}

public void Stop()
{
    _disposable?.Dispose();
    _watcher?.Dispose();
}

private void ReadFile(string file)
{
    try
    {
        using (var stream = new FileStream(file, FileMode.Open, FileAccess.Read))
        {
        }
    }
    catch (Exception exp)
    {
        System.Diagnostics.Debug.WriteLine("read error.");
    }
}

まぁ100msも待てば十分でしょう