我想知道如何找出.NET Core中PhysicalFileProvider更改了哪些文件?
var watcher = new PhysicalFileProvider("../.");
var changeToken = watcher.Watch("*.*");
我需要一些结果,例如
abc.txt => Deleted
xyz.mp3 => Added
opq.png => Changed
有可能吗?
答案 0 :(得分:0)
我也一直试图从令牌状态中获取相同的信息,但是没有运气在令牌中找到任何指示已更改的信息。我的实现是针对Linux容器,其中需要监视网络文件共享的更改,因此FileSystemWatcher
不够用,因此我被迫使用PhysicalFileProvider
类。 (请参阅GitHub Issue)
我的建议是,如果该实现适合您的情况,请使用FileSystemWatcher
。
如果这不起作用,请使用PhysicalFileProvider.GetDirectoryContents()
方法并存储要监视的目录或文件的状态。当令牌指示发生更改时,请将存储的状态与目录的当前状态进行比较。
答案 1 :(得分:0)
不幸的是,FileSystemWatcher
不会在带有NFS场景的Docker上触发事件。有趣的是PhysicalFileProvider
使用FileSystemWatcher
作为基础系统。无论如何,如果您想使用肮脏的解决方法,那就在这里。
private IChangeToken _fileChangeToken;
private PhysicalFileProvider _fileProvider;
private readonly ConcurrentDictionary<string, DateTime> _files = new ConcurrentDictionary<string, DateTime>();
public void DoWork()
{
_fileProvider = new PhysicalFileProvider(@"/mnt/uploads"); // e.g. C:\temp
WatchForFileChanges();
}
private void WatchForFileChanges()
{
IEnumerable<string> files = Directory.EnumerateFiles(DirectoryToWatch, "*.*", SearchOption.AllDirectories);
foreach (string file in files)
{
if (_files.TryGetValue(file, out DateTime existingTime))
{
_files.TryUpdate(file, File.GetLastWriteTime(file), existingTime);
}
else
{
if (File.Exists(file))
{
_files.TryAdd(file, File.GetLastWriteTime(file));
}
}
}
_fileChangeToken = _fileProvider.Watch("**/*.*");
_fileChangeToken.RegisterChangeCallback(Notify, default);
}
private void Notify(object state)
{
_logger.LogInformation("File activity detected.");
WatchForFileChanges();
}