如何让SaveToTxt函数复用EdFile处理的文件?C#多文件读写同步问题
实现EdFile与SaveToTxt的文件同步
问题现状
EdFile函数会遍历wwwroot\Files目录下所有文本文件,将每行解析为EditItems对象存入列表,但所有文件的条目都混在一起;SaveToTxt只能将所有内容写入固定文件,无法对应回原文件。要实现每个被解析的文件都能正确写回,需要调整数据结构和方法逻辑。
步骤1:调整数据结构
需要给每个解析条目绑定原文件路径,推荐两种方式:
方式一:给EditItems新增文件路径属性
public class EditItems { public string FilePath { get; set; } // 存储条目所属的原文件路径 public string One { get; set; } public string Two { get; set; } public string Three { get; set; } }
方式二:创建容器类按文件分组存储
public class FileEditGroup { public string FilePath { get; set; } // 原文件路径 public List<EditItems> Items { get; set; } = new List<EditItems>(); // 该文件对应的所有条目 }
步骤2:修改EdFile方法
根据选择的数据结构,调整读取逻辑:
对应方式一的写法
List<EditItems> items = new List<EditItems>(); public void EdFile() { items.Clear(); // 每次读取前清空旧数据,避免内容混淆 foreach (var file in System.IO.Directory.GetFiles(@"wwwroot\Files")) { foreach (var line in System.IO.File.ReadLines(file)) { string[] values = line.Split(','); if (values.Length == 3) { items.Add(new EditItems { FilePath = file, // 绑定原文件路径 One = values[0], Two = values[1], Three = values[2] }); } } } }
对应方式二的写法
List<FileEditGroup> fileGroups = new List<FileEditGroup>(); public void EdFile() { fileGroups.Clear(); foreach (var file in System.IO.Directory.GetFiles(@"wwwroot\Files")) { var group = new FileEditGroup { FilePath = file }; foreach (var line in System.IO.File.ReadLines(file)) { string[] values = line.Split(','); if (values.Length == 3) { group.Items.Add(new EditItems { One = values[0], Two = values[1], Three = values[2] }); } } fileGroups.Add(group); } }
步骤3:修改SaveToTxt方法
根据数据结构,将内容写回对应的原文件:
对应方式一的写法
public void SaveToTxt() { // 按文件路径分组所有条目 var groupedItems = items.GroupBy(item => item.FilePath); foreach (var group in groupedItems) { StringBuilder sb = new StringBuilder(); foreach (var item in group) { sb.AppendLine($"{item.One},{item.Two},{item.Three}"); } System.IO.File.WriteAllText(group.Key, sb.ToString()); } }
对应方式二的写法
public void SaveToTxt() { foreach (var group in fileGroups) { StringBuilder sb = new StringBuilder(); foreach (var item in group.Items) { sb.AppendLine($"{item.One},{item.Two},{item.Three}"); } System.IO.File.WriteAllText(group.FilePath, sb.ToString()); } }
页面按钮代码(无需修改)
<button @onclick="EdFile">Edit file</button> <button @onclick="SaveToTxt">Save</button>
额外提示
- 每次调用EdFile前清空旧数据,避免新旧内容混合
- 文件读写时建议添加异常捕获(比如处理文件被占用的情况)
- 若处理大文件,逐行写入比StringBuilder更节省内存,可根据需求调整
内容的提问来源于stack exchange,提问作者Piani Dud
相关产品推荐
相关产品推荐

