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
相关产品推荐
相关产品推荐

