.NET Framework 4.8项目中FileSystemWatcher.Filters.Add()失效问题
.NET Framework 4.8中FileSystemWatcher.Filters.Add()无效的原因及修复方案
根本原因:框架API差异
你在.NET 7里能用Filters.Add()是因为这个集合属性是.NET Core 2.0之后才新增的,但**.NET Framework 4.8的FileSystemWatcher根本没有这个属性**——你当前项目里的Filters.Add()要么是编译错误(如果没报错,大概率是误引入了兼容包但实际不生效),要么就是代码逻辑没走到分支,看起来像没效果。
在.NET Framework中,设置多个筛选器只能用Filter属性,用分号分隔规则,比如:
// 同时监听txt和jpg文件 watcher.Filter = "*.txt;*.jpg";
你的代码还有两个关键问题
- 重复创建监听器导致资源泄漏
每次文本框内容变化都会新建FileSystemWatcher,旧的实例没被停止和释放,会导致多个监听器同时运行,不仅浪费资源,还会让筛选器设置混乱。
修复:把监听器设为类成员变量,每次创建前清理旧实例:
private FileSystemWatcher _watcher; // 类级变量 public void Vars(string text) { // 先停掉旧监听器 if (_watcher != null) { _watcher.EnableRaisingEvents = false; _watcher.Dispose(); } // 再创建新实例... }
- 筛选器分支触发条件不可靠
你用comboBox1.Text == "Image"判断,但如果用户没选中选项直接输入文本,或者大小写不一致,这个分支就不会执行。改成判断选中项更可靠:
if (comboBox1.SelectedItem?.ToString() == "Image") { _watcher.Filter = "*.txt"; // .NET Framework用Filter属性 }
修正后的完整代码
namespace pro { public partial class Form2 : Form { private FileSystemWatcher _watcher; public Form2() { InitializeComponent(); comboBox1.Items.AddRange(new[] { "Image", "Document", "Video", "Audio", "Web File", "System File", "Database File", "Presentation File" }); } public void Vars(string text) { // 清理旧监听器 if (_watcher != null) { _watcher.EnableRaisingEvents = false; _watcher.Dispose(); } if (string.IsNullOrWhiteSpace(text)) return; _watcher = new FileSystemWatcher(); _watcher.Path = text; _watcher.NotifyFilter = NotifyFilters.DirectoryName | NotifyFilters.FileName; // .NET Framework下设置筛选器 if (comboBox1.SelectedItem?.ToString() == "Image") { _watcher.Filter = "*.txt"; // 多筛选器示例:_watcher.Filter = "*.txt;*.png;*.jpg"; } else { _watcher.Filter = "*.*"; // 默认监听所有文件 } _watcher.IncludeSubdirectories = checkBox1.Checked; _watcher.Created += OnCreated; _watcher.EnableRaisingEvents = true; } private static void OnCreated(object sender, FileSystemEventArgs file) { string value = $"Created: {file.FullPath}"; // 这里可以加UI更新逻辑,比如用Invoke回到主线程显示内容 } private void textBox2_TextChanged(object sender, EventArgs e) { Vars(textBox2.Text); } private void checkBox1_CheckedChanged(object sender, EventArgs e) { // 修改子目录选项时重新初始化监听器 if (!string.IsNullOrWhiteSpace(textBox2.Text)) { Vars(textBox2.Text); } } // 窗体关闭时清理资源 protected override void OnFormClosing(FormClosingEventArgs e) { base.OnFormClosing(e); _watcher?.Dispose(); } } }
内容的提问来源于stack exchange,提问作者AmsterdamGhoul
相关产品推荐
相关产品推荐

