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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 01:30:02