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

如何存储和读取FileSystemWatcher的NotifyFilters枚举组合值至XML文件

处理FileSystemWatcher的NotifyFilter配置存储与读取

因为System.IO.NotifyFilters是带有[Flags]特性的枚举(本质是位掩码类型),以下是几种实用的存储与读取方案:

方法1:直接用XmlSerializer序列化枚举(最简便)

XmlSerializer原生支持Flags枚举的序列化与反序列化,会自动将选中的枚举值序列化为逗号分隔的字符串,读取时自动还原,无需手动转换。

步骤:

  1. 定义包含配置项的类:
public class AppConfig
{
    public NotifyFilters WatcherNotifyFilter { get; set; }
    // 可添加其他配置项
    public string WatchPath { get; set; }
    public bool IncludeSubdirectories { get; set; }
}
  1. 存储配置到XML:
// 假设已配置好FileSystemWatcher实例
var watcher = new FileSystemWatcher();
watcher.NotifyFilter = NotifyFilters.FileName | NotifyFilters.LastWrite;
watcher.Path = @"C:\WatchDir";
watcher.IncludeSubdirectories = true;

// 序列化配置到XML文件
var config = new AppConfig
{
    WatcherNotifyFilter = watcher.NotifyFilter,
    WatchPath = watcher.Path,
    IncludeSubdirectories = watcher.IncludeSubdirectories
};

using (var stream = new FileStream("appconfig.xml", FileMode.Create))
{
    var serializer = new XmlSerializer(typeof(AppConfig));
    serializer.Serialize(stream, config);
}
  1. 读取配置并赋值给FileSystemWatcher:
using (var stream = new FileStream("appconfig.xml", FileMode.Open))
{
    var serializer = new XmlSerializer(typeof(AppConfig));
    var config = (AppConfig)serializer.Deserialize(stream);

    var watcher = new FileSystemWatcher
    {
        NotifyFilter = config.WatcherNotifyFilter,
        Path = config.WatchPath,
        IncludeSubdirectories = config.IncludeSubdirectories
    };
}

生成的XML片段示例:

<AppConfig>
  <WatcherNotifyFilter>FileName, LastWrite</WatcherNotifyFilter>
  <WatchPath>C:\WatchDir</WatchPath>
  <IncludeSubdirectories>true</IncludeSubdirectories>
</AppConfig>

方法2:手动转为整数存储(紧凑存储场景)

Flags枚举的每个值对应2的幂次整数,组合值可直接转成整数存储,读取时再转回枚举。

存储代码:

int filterValue = (int)watcher.NotifyFilter;
var config = new CompactConfig { NotifyFilterInt = filterValue };
// 序列化逻辑同方法1

读取代码:

var config = (CompactConfig)serializer.Deserialize(stream);
watcher.NotifyFilter = (NotifyFilters)config.NotifyFilterInt;

方法3:手动转为逗号分隔字符串存储(手动编辑场景)

如果需要配置文件可读性强、方便用户手动修改,可将选中的枚举值转为逗号分隔的字符串存储。

存储代码:

string filterStr = string.Join(",", watcher.NotifyFilter.ToString().Split(',').Select(s => s.Trim()));
var config = new ReadableConfig { NotifyFilterStr = filterStr };
// 序列化逻辑同方法1

读取代码:

var config = (ReadableConfig)serializer.Deserialize(stream);
// 用Enum.TryParse保证容错性
if (Enum.TryParse<NotifyFilters>(config.NotifyFilterStr, out var filter))
{
    watcher.NotifyFilter = filter;
}
else
{
    // 配置无效时设置默认值
    watcher.NotifyFilter = NotifyFilters.FileName | NotifyFilters.LastWrite;
}

注意事项

  • 优先使用方法1,XmlSerializer已处理所有细节,代码简洁不易出错。
  • 若允许手动编辑XML,方法3可读性更好,但需用Enum.TryParse处理无效输入。
  • 所有方案都适用于普通文本文件,只需将XML序列化逻辑替换为File.WriteAllText/File.ReadAllText即可。

内容的提问来源于stack exchange,提问作者Tobias G.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 05:05:25