如何找出.NET Core中PhysicalFileProvider更改了哪些文件?

时间:2019-04-04 12:54:30

标签: c# asp.net-core .net-core

我想知道如何找出.NET Core中PhysicalFileProvider更改了哪些文件?

var watcher = new PhysicalFileProvider("../.");
var changeToken = watcher.Watch("*.*");

我需要一些结果,例如

abc.txt => Deleted
xyz.mp3 => Added
opq.png => Changed

有可能吗?

2 个答案:

答案 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();
    }