如何存储和读取FileSystemWatcher的NotifyFilters枚举组合值至XML文件
处理FileSystemWatcher的NotifyFilter配置存储与读取
因为System.IO.NotifyFilters是带有[Flags]特性的枚举(本质是位掩码类型),以下是几种实用的存储与读取方案:
方法1:直接用XmlSerializer序列化枚举(最简便)
XmlSerializer原生支持Flags枚举的序列化与反序列化,会自动将选中的枚举值序列化为逗号分隔的字符串,读取时自动还原,无需手动转换。
步骤:
- 定义包含配置项的类:
public class AppConfig { public NotifyFilters WatcherNotifyFilter { get; set; } // 可添加其他配置项 public string WatchPath { get; set; } public bool IncludeSubdirectories { get; set; } }
- 存储配置到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); }
- 读取配置并赋值给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.
相关产品推荐
相关产品推荐

