-1

我需要检查一个文件夹中是否有某些类型的文件,然后将它们添加到一个数组中,然后一个一个打印和删除它们。如果在此过程中添加了新文件,它只会被添加到打印队列中。我正在尝试监视是否每 1 秒创建一个文件。为此,我使用了带计时器的 FileSystemWatcher。我正在尝试将 2 个事件函数绑定在一起,但尝试时出现奇怪的错误。我在表单应用程序中执行此操作,今天我第一次看到这两个名称空间,我对多线程、后台线程或 System.Threading.Timer 和 System.Windows.Forms.Timer 之间的区别一无所知最适合这种特殊情况,所以如果问题在这些主题上过于具体,我可能也需要对此进行一些快速澄清。

基本上代码就是这个(它是一个更大程序的一部分,所以我会尝试只粘贴与问题相关的代码,另外,不要介意作为整个项目一部分的额外 using 命名空间。最后我不知道如何在此处的代码块中突出显示 C# 语法,使用 ctrl+K 的格式化工具构成了您在下一个代码块中阅读的内容。我尝试将其缩进一点以便更好地阅读。):

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Collections;
using System.IO.Ports;
using System.Diagnostics;

private Timer timer1; //Windows.Form Timer

private void button1_Click(object sender, EventArgs e) {
  try {
    InitTimer();
    FileSystemWatcher SysWatch = new FileSystemWatcher(FilesPath, "*.*");
    SysWatch.Created += new FileSystemEventHandler(SysWatch_Created);
    SysWatch.EnableRaisingEvents = true;
  }
  catch (Exception exc) {
    MessageBox.Show(exc.Message); 
  }
}

private void InitTimer() {
  timer1 = new Timer();
  timer1.Tick+=new EventHandler(timer1_Tick);
  timer1.Interval = 2000;
  timer1.Start();
}

private void timer1_tick (object sender, EventArgs xz) {
  void SysWatch_Created(object Sender, FileSystemEventArgs w) {
    MessageBox.Show("File " + w.FullPath + "Creato");
  }
}

我试图做的是尝试将文件创建事件控制器嵌套在计时器内,以便它检查文件创建,但我这样做的方式可能有问题。

我得到了这种东西(就在我尝试将 SysWatch_Created 嵌套到 timer1_Tick 中时,直到那时一切都很完美)。

在此处输入链接描述

我认为这与我试图用 Event Args 或其他东西嵌套 2 个方法的事实有关......不知道

欢迎任何关于如何做得更好的例子。

谢谢大家。

4

1 回答 1

2

您不能将方法放在这样的方法中,或者将事件处理程序放在事件处理程序中,例如它;您将需要在计时器处理程序旁边定义 FileSystemWatcher 处理程序。但是你的观察者会为你做滴答式的监控,并根据它在发生事件时引发事件,而不是你的计时器。

稍微解释一下,这样说是有道理的,并且您不再有那个特定的错误(或一组错误):

private void timer1_tick (object sender, EventArgs xz) {

}

void SysWatch_Created(object Sender, FileSystemEventArgs w) {
  MessageBox.Show("File " + w.FullPath + "Creato");
}

但是,那么你仍然需要在间隔调用它,并且手动调用处理程序方法在这里没有多大意义。考虑以下:

private void timer1_tick (object sender, EventArgs xz) {
  SysWatch_Created(this, null);
}

发件人可能应该是 FileSystemWatcher,但不一定是最不关心的:否则,您希望通过我null在此实例中放置的位置传递什么?只有观察者在此上下文中具有此信息。

回到正题。您不需要计时器,FileSystemWatcher 将在内部进行轮询并通知您,因为您告诉它 ( Created += new FileSystemEventHandler(SysWatch_Created);)。不过,你不能专门设置这个东西的轮询间隔。

于 2013-03-29T00:29:51.980 回答