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

C# WPF使用OpenFileDialog多选文件仅重复首个文件问题求助

问题原因
  • 核心错误:循环内调用OpenFileDialog.OpenFile()只会返回首个选中文件的流。你代码中每次循环都将整个choofdlog对象添加到textFile.files集合,再调用它的OpenFile()方法,无论循环执行多少次,该方法默认都只返回第一个选中文件的流,因此读取的始终是同一个文件。
  • 潜在空引用异常:如果用户在文件选择框点击取消,arrAllFiles不会被赋值,后续循环访问arrAllFiles.Length会直接抛出空引用异常。
  • 资源泄漏风险:Stream和StreamReader都属于非托管资源,代码中没有做释放处理,长期运行会出现内存泄漏、文件被占用无法修改/删除的问题。
修复方案

调整后的代码如下:

TextFile textFile = new TextFile();

private void btnOpenFiles_Click(object sender, RoutedEventArgs e)
{
    OpenFileDialog choofdlog = new OpenFileDialog();
    choofdlog.Filter = "All Files (*.*)|*.*";
    choofdlog.Multiselect = true;
    
    // 将后续处理逻辑放到判断块内,避免用户取消选择时空引用报错
    if (choofdlog.ShowDialog() == true)
    {
        string[] arrAllFiles = choofdlog.FileNames; 
        for (var i = 0; i < arrAllFiles.Length; i++)
        {       
            // 存储当前文件路径,不要存储整个OpenFileDialog对象
            textFile.files.Add(arrAllFiles[i]);
            // 直接打开当前遍历到的对应文件
            Stream myStream = File.OpenRead(arrAllFiles[i]);
            StreamReader reader = new StreamReader(myStream);
            textFile.readFile.Add(reader);
            lbFiles.Items.Add(arrAllFiles[i]);  
        }
    }
}
额外优化建议
  • 如果不需要长期持有StreamReader对象,建议在循环内用using包裹流和读取器的创建逻辑,读完文件内容就立即释放资源,避免文件被长期占用。
  • 可以直接遍历arrAllFiles集合,不需要用索引遍历,代码更简洁。

内容的提问来源于stack exchange,提问作者Filip Resceanu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 15:54:04