You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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";

你的代码还有两个关键问题

  1. 重复创建监听器导致资源泄漏
    每次文本框内容变化都会新建FileSystemWatcher,旧的实例没被停止和释放,会导致多个监听器同时运行,不仅浪费资源,还会让筛选器设置混乱。

修复:把监听器设为类成员变量,每次创建前清理旧实例:

private FileSystemWatcher _watcher; // 类级变量

public void Vars(string text)
{
    // 先停掉旧监听器
    if (_watcher != null)
    {
        _watcher.EnableRaisingEvents = false;
        _watcher.Dispose();
    }
    // 再创建新实例...
}
  1. 筛选器分支触发条件不可靠
    你用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 17:32:19