如何使用FileSystemWatcher跟踪文件大小,直到文件大小不再更改

本文关键字:文件大小 不再 何使用 FileSystemWatcher 跟踪 | 更新日期: 2023-09-27 18:26:47

观察者方法:

FileSystemWatcher watcher = null;
        private void watch()
        {
            watcher = new FileSystemWatcher();
            watcher.Path = SavePathTextBox.Text;
            watcher.NotifyFilter = NotifyFilters.LastWrite;
            watcher.Filter = "*.JPG";
            watcher.Changed += watcher_Changed;
            watcher.EnableRaisingEvents = true;
        }

然后在事件Changed中,我正在观察文件是否繁忙,同时也在观察文件大小:

void watcher_Changed(object sender, FileSystemEventArgs e)
    {
        if (IsFileReady(e.FullPath) == false)
        {
            this.Invoke((Action)delegate { label6.Text = "Busy"; });
        }
        else
        {
            if (e.ChangeType == WatcherChangeTypes.Changed)
            {
                var info = new FileInfo(e.FullPath);
                var theSize = info.Length;
            }
            else
            {
                this.Invoke((Action)delegate { label6.Text = "File Ready"; });
                watcher.Dispose();
            }
        }
    }

我看到了一个断点,它正在进入部分:

var info = new FileInfo(e.FullPath);
var theSize = info.Length;

但它永远不会到达另一个部分:

this.Invoke((Action)delegate { label6.Text = "File Ready"; });
watcher.Dispose();

我如何知道文件大小何时不再更改?也许Changed事件中的整个代码是错误的,但我想检查文件是否繁忙,并跟踪文件大小,直到大小停止更改。

如何使用FileSystemWatcher跟踪文件大小,直到文件大小不再更改

FileSystemWatcher Changed事件仅在对要监视的文件或目录进行更改时引发。如果没有更改,则不会触发该事件。有关详细信息,请参阅MSDN文档。

根据MSDN参考资料,WatcherChangeTypes枚举甚至没有任何"无更改"选项

如果您正在等待另一个进程完成对文件的写入,那么我建议您实现一个计时器,该计时器将检查文件自上次计时器计时以来是否发生了更改。当然,您的计时器时间跨度应该足够长,以捕捉可能发生的最慢更改时间。如果您正在等待用户,那么您可能要等待很长时间。

或者,您可以查看目标文件的打开文件句柄
例如,请参阅MS文件句柄实用程序。也许在计时器上调用该实用程序,并为目标文件设置命令行参数,然后当它没有返回任何打开的句柄时,您就会知道其他进程已经关闭了它们的句柄。但这并不意味着他们不会重新打开文件。