C# foreach循环每次迭代的found与MemoryStream值如何存储供后续调用
C#循环迭代值存储及压缩逻辑修正方案
核心修改思路
- 调整代码执行顺序:先遍历所有路径生成所需数据并存储,再执行压缩打包逻辑
- 定义配对存储结构:每轮迭代的
List<string> found和对应MemoryStream是一一绑定关系,用强类型集合存储避免对应关系错乱 - 修正变量声明错误:方法内部不允许定义带public/static修饰符的局部变量
具体实现代码
// 先定义存储配对数据的结构,也可以直接用值元组省略这步 public class PathProcessResult { public List<string> Founds { get; set; } public MemoryStream DataStream { get; set; } } public static void Run() { // 修正desktop变量声明错误 string desktop = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Desktop); List<string> targetDirNames = new List<string> { "qw", "er", "ty", "ui", "op", "as", "df", "gh" }; // 定义存储所有迭代结果的集合 List<PathProcessResult> allResults = new List<PathProcessResult>(); // 第一步:先遍历所有路径,生成数据存入集合 foreach (string path in Paths.sWPaths) { // 注意:原代码此处枚举逻辑有误,枚举后取的是固定path的名称而非枚举到的目录名称,已修正 List<string> found = Directory.EnumerateDirectories(desktop) .Select(d => new DirectoryInfo(d).Name) .Where(n => targetDirNames.Contains(n)) .ToList(); List<file> Informone = Data.Get(Path.Combine(desktop, path)); MemoryStream memoryone = new MemoryStream(cUtils.WriteOne(Informone).ToArray()); // 把本轮迭代结果存入全局集合 allResults.Add(new PathProcessResult { Founds = found, DataStream = memoryone }); } // 第二步:用提前存储好的集合执行压缩逻辑 using (var result = new MemoryStream()) { using (var archive = new ZipArchive(result, ZipArchiveMode.Create, true)) { foreach (var processResult in allResults) { // 遍历当前组所有匹配到的目录名创建压缩条目 foreach (string p in processResult.Founds) { var pr = archive.CreateEntry($"Found_{p}.txt"); using (var entryStream = pr.Open()) { // 流读取前需要重置位置到起始点 processResult.DataStream.Position = 0; processResult.DataStream.CopyTo(entryStream); } } } } File.WriteAllBytes(@"found.zip", result.ToArray()); } // 最后释放所有MemoryStream资源 foreach (var res in allResults) { res.DataStream.Dispose(); } }
额外注意事项
- 原代码中目录枚举的Select逻辑存在逻辑错误,会导致每次返回的都是当前遍历的path的名称,而非枚举到的桌面目录下的子目录名称,上述代码已做修正
- MemoryStream写入后读取前需要将Position属性设置为0,否则会从流的末尾开始读取导致没有数据写入压缩包
- 所有非托管资源使用完后需要手动释放,避免内存泄漏
内容的提问来源于stack exchange,提问作者meteor
相关产品推荐
相关产品推荐

