观察者方法:
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;
但它永远不会到达 else 部分:
this.Invoke((Action)delegate { label6.Text = "File Ready"; });
watcher.Dispose();
我怎么知道什么时候文件大小不再改变?也许 Changed 事件中的整个代码是错误的,但我想检查文件是否繁忙,并跟踪文件大小,直到大小停止变化。
最佳答案
FileSystemWatcher Changed 事件仅在对正在监视的文件或目录进行更改时引发。如果没有更改,则不会触发该事件。参见 The MSDN Documentation了解更多详情。
根据 This MSDN reference ,WatcherChangeTypes 枚举甚至没有任何“无变化”选项
如果您正在等待另一个进程完成对文件的写入,那么我建议实现一个计时器,该计时器将检查自上次计时器滴答以来文件是否已更改。当然,您的计时器时间跨度应该足够长,以捕获可能发生的最慢变化时间。如果您正在等待用户,那么您可能会等待很长时间。
或者,您可以查看目标文件的打开文件句柄。
查看MS File Handle utility例如。
也许使用为目标文件设置的命令行参数在计时器滴答上调用该实用程序,然后当它不返回任何打开的句柄时,您将知道其他进程已关闭其句柄。不过,这并不意味着他们不会重新打开文件。
关于c# - 我如何使用 FileSystemWatcher 跟踪文件大小,直到文件大小不再更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34256761/