[C#] 監聽是否在執行狀態時 appsettings.json 有被修改

  • 60
  • 0

演示如何在程式執行中設定檔(appsettings.json)實時監聽

開發環境:

  1. .net 8
  2. install NuGet Microsoft.Extensions.Configuration、Microsoft.Extensions.Configuration.Json

.

// 監視設定檔的變更並記錄到日誌文件中
using Microsoft.Extensions.Configuration;
// 用於監視設定檔的變更
using Microsoft.Extensions.Primitives;
// 用於讀取設定檔
using System.Text.Json.Nodes;

class Program
{
    // 舊的設定檔
    static JsonNode? oldConfigurationJson;
    // 設定檔根物件
    static IConfigurationRoot? configuration;

    static void Main(string[] args)
    {
        // 建立設定檔建構器
        var configurationBuilder = new ConfigurationBuilder();
        // 加入設定檔 reloadOnChange: true => 當 appsettings.json 被修改時,會自動重新載入
        configurationBuilder.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
        // 建立設定檔根物件
        configuration = configurationBuilder.Build();

        // 儲存初始設定
        oldConfigurationJson = JsonNode.Parse(File.ReadAllText("appsettings.json"));

        // 設定回呼函式以處理檔案變更
        ChangeToken.OnChange(
            // 監視設定檔
            () => configuration.GetReloadToken(),
            // 當設定檔變更時的處理方法
            () => OnConfigurationChanged()
        );

        Console.WriteLine("監視 'appsettings.json' 的變更。按 Enter 鍵結束程序。");
        Console.ReadLine();
    }

    /// <summary>
    /// 偵測到 'appsettings.json' 的變更時的處理方法。
    /// </summary>
    private static void OnConfigurationChanged()
    {
        Console.WriteLine("偵測到 'appsettings.json' 的變更!");
        var newConfigurationJson = JsonNode.Parse(File.ReadAllText("appsettings.json"));

        // 比較舊設定和新設定
        var differences = CompareJson(oldConfigurationJson, newConfigurationJson);

        // 記錄到日誌文件中
        File.AppendAllText("config-changes.log", $"{DateTime.Now}: {differences}\n");

        // 更新舊設定
        oldConfigurationJson = newConfigurationJson;
    }

    /// <summary>
    /// 比較兩個 JSON 物件並返回差異。
    /// </summary>
    /// <param name="oldJson">舊的 JSON 物件。</param>
    /// <param name="newJson">新的 JSON 物件。</param>
    /// <returns>差異的字串,如果沒有差異則返回 "無變更"。</returns>
    private static string CompareJson(JsonNode oldJson, JsonNode newJson)
    {
        var differences = "";
        foreach (var property in oldJson.AsObject())
        {
            var propertyName = property.Key;
            var oldValue = property.Value;
            var newValue = newJson[propertyName];

            if (newValue == null || !newValue.Equals(oldValue))
            {
                differences += $"{propertyName}: old='{oldValue}', new='{newValue}'; \n";
            }
        }

        return string.IsNullOrEmpty(differences) ? "無變更" : differences;
    }
}

參考:

https://www.gss.com.tw/blog/net-core-偵測指定檔案或目錄變化時自動執行某些動作