feat: 添加内容热重载指令 (#4)
All checks were successful
Build blog docker image / Build-Blog-Image (push) Successful in 1m34s
All checks were successful
Build blog docker image / Build-Blog-Image (push) Successful in 1m34s
Reviewed-on: #4
This commit is contained in:
61
YaeBlog.Core/Services/BlogChangeWatcher.cs
Normal file
61
YaeBlog.Core/Services/BlogChangeWatcher.cs
Normal file
@@ -0,0 +1,61 @@
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Microsoft.Extensions.Options;
|
||||
using YaeBlog.Core.Models;
|
||||
|
||||
namespace YaeBlog.Core.Services;
|
||||
|
||||
public sealed class BlogChangeWatcher : IDisposable
|
||||
{
|
||||
private readonly FileSystemWatcher _fileSystemWatcher;
|
||||
private readonly ILogger<BlogChangeWatcher> _logger;
|
||||
|
||||
public BlogChangeWatcher(IOptions<BlogOptions> options, ILogger<BlogChangeWatcher> logger)
|
||||
{
|
||||
_logger = logger;
|
||||
_fileSystemWatcher = new FileSystemWatcher(Path.Combine(Environment.CurrentDirectory, options.Value.Root));
|
||||
|
||||
_fileSystemWatcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName |
|
||||
NotifyFilters.DirectoryName | NotifyFilters.Size;
|
||||
_fileSystemWatcher.IncludeSubdirectories = true;
|
||||
_fileSystemWatcher.EnableRaisingEvents = true;
|
||||
}
|
||||
|
||||
public async Task<string?> WaitForChange(CancellationToken cancellationToken = default)
|
||||
{
|
||||
TaskCompletionSource<string?> tcs = new();
|
||||
cancellationToken.Register(() => tcs.TrySetResult(null));
|
||||
|
||||
_logger.LogDebug("Register file change handle.");
|
||||
_fileSystemWatcher.Changed += FileChangedCallback;
|
||||
_fileSystemWatcher.Created += FileChangedCallback;
|
||||
_fileSystemWatcher.Deleted += FileChangedCallback;
|
||||
_fileSystemWatcher.Renamed += FileChangedCallback;
|
||||
|
||||
string? result;
|
||||
try
|
||||
{
|
||||
result = await tcs.Task;
|
||||
}
|
||||
finally
|
||||
{
|
||||
_logger.LogDebug("Unregister file change handle.");
|
||||
_fileSystemWatcher.Changed -= FileChangedCallback;
|
||||
_fileSystemWatcher.Created -= FileChangedCallback;
|
||||
_fileSystemWatcher.Deleted -= FileChangedCallback;
|
||||
_fileSystemWatcher.Renamed -= FileChangedCallback;
|
||||
}
|
||||
|
||||
return result;
|
||||
|
||||
void FileChangedCallback(object _, FileSystemEventArgs e)
|
||||
{
|
||||
_logger.LogDebug("File {} change detected.", e.Name);
|
||||
tcs.TrySetResult(e.Name);
|
||||
}
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
_fileSystemWatcher.Dispose();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user