以下では、Windows 上で「フォルダ監視 → 変化を検知したら何らかの処理」を行う際に
という 2 条件を満たしやすい代表的な言語/環境を比較し、お勧めの使い分けを示します。 (コード例はすべて 2 スペースインデント にしています)
特性 | 評価 |
---|---|
メモリ使用量 | 数 10 MB 程度の常駐で済む(実行ポリシー次第でさらに抑制可) |
反応速度 | .NET の FileSystemWatcher をそのまま呼び出すので OS ネイティブ水準 |
変更容易性 | スクリプト 1 ファイルを書き換えれば即反映。ホットリロードも容易 |
導入コスト | Windows 10/11 ならほぼ標準搭載(PowerShell 5.x)。Winget で 7.x も簡単 |
# Watch.ps1
$path = 'C:\\\\WatchHere'
$filter = '*.*' # 監視対象
$fsw = New-Object System.IO.FileSystemWatcher $path, $filter -Property @{
IncludeSubdirectories = $true
EnableRaisingEvents = $true
}
# イベント登録(Created, Changed, Deleted, Renamed の 4 種)
Register-ObjectEvent $fsw Created -Action {
param($sender, $eventArgs)
Write-Host "Created: $($eventArgs.FullPath)"
# TODO: ここに処理を追加
}
# 無限待機
Write-Host "Watching $path … Press Ctrl+C to exit."
while ($true) { Start-Sleep -Seconds 1 }
Register-ObjectEvent
の中身を書き換えるだけ。FileSystemWatcher
を使ったコードは数十行で済む。dotnet watch
で開発中のホットリロードは可)。// Program.cs (.NET 8 Worker Service)
using System.IO;
using Microsoft.Extensions.Hosting;
IHost host = Host.CreateDefaultBuilder(args)
.UseWindowsService() // Windows サービス化
.ConfigureServices(svcs =>
{
svcs.AddHostedService<WatcherService>();
})
.Build();
await host.RunAsync();
(WatcherService
内で FileSystemWatcher
を登録)