【问题标题】:How to monitor file size changes using a timer?如何使用计时器监控文件大小变化?
【发布时间】:2015-07-30 08:14:50
【问题描述】:
private void MonitorFileForChanges()
{
    Timer timerFileMonitor = new Timer();
    timerFileMonitor.Interval = 10000;
    timerFileMonitor.Tick += timerFileMonitor_Tick;
    timerFileMonitor.Start();
}

void timerFileMonitor_Tick(object sender, EventArgs e)
{
    var directory = new DirectoryInfo(userVideosDirectory);
    var myFile = directory.GetFiles()
     .OrderByDescending(f => f.LastWriteTime)
     .First();
    long oldFileSize = 0;
}

我的问题是如何在 Tick 事件中检查文件大小的变化? 当没有更多变化时停止计时器。

尝试使用 FileSystemWather:

private void WatchDirectory()
        {
            FileSystemWatcher watcher = new FileSystemWatcher();
            watcher.Path = userVideosDirectory;
            watcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.Size;
            watcher.Filter = "*.mp4";
            watcher.Changed += new FileSystemEventHandler(OnChanged);
            watcher.EnableRaisingEvents = true;
        }

        private void OnChanged(object source, FileSystemEventArgs e)
        {
            if (e.ChangeType == WatcherChangeTypes.Changed)
            {
                var info = new FileInfo(e.FullPath);
                var theSize = info.Length;
                label2.BeginInvoke((Action)(() =>
                {
                    label2.Text = theSize.ToString();
                }));
            }

            dirchanged = true;
        }

这是可行的,但我如何检查最后一次大小更改我的意思是如何在 5 或 10 秒后再次检查以查看是否有其他更改,如果没有则停止事件?

我的意思是没有像这样完成的事件。

【问题讨论】:

标签: c# .net winforms


【解决方案1】:

首先,如果您没有充分的理由 - 不要使用计时器。 在大多数情况下,这是一种不好的做法。 考虑改用FileSystemWatcher。

关于文件大小 - 为此使用 FileInfo 类。

【讨论】:

  • Vitaliy 我现在正在使用 filesystemwatcher 但我如何检查它何时完成更新文件大小更改我怎么知道它?没有完成的事件或其他东西。我的意思是在 OnChanged 事件中,我有一个设置为 true 的标志。该标志适用于检查是否创建了新文件。所以我知道在另一个地方的程序中创建了一个新文件。但是我怎么知道在我的程序中的其他地方大小不再改变了?我以使用 FilesystemWatcher 的方式添加到我的问题中。
  • 据我了解,您注意观看外部进程正在处理的视频文件。我认为对您来说最好的解决方案是检查文件是否被锁定。这是example 如何检查它。您可以检查每次 filesystemwatcher 引发更改事件,并且很可能在最后一个更改文件将被解锁 - 这就是您正在等待的。
  • 您对视频文件正在由外部进程处理是正确的。我将验证链接中的示例。
  • 工作得很好。谢谢。
【解决方案2】:

您可以使用 FileInfo.Length 来获取文件的大小(以字节为单位)。比如:

FileInfo f = new FileInfo(pathOfTheFile);
long size = f.Length;
if (this.lastSize == size)
{
     timerFileMonitor.Stop();
}
else 
{
     this.lastSize = size;
}

一旦文件大小自上次以来没有变化,您可以停止计时器。只需保留一个具有大小的字段并进行比较。

【讨论】:

    猜你喜欢
    • 2014-09-08
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-16
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多