VB.NET读取文件所有行却仅写入最后一行的问题排查
问题原因及修复方案
核心错误点
文件读取方式错误
File.ReadLines(fileName)返回的是延迟加载的IEnumerable(Of String),你直接将其赋值给String()类型变量,在VB中这会导致仅读取第一行数据,后续循环无法遍历剩余行。换行符重复添加
调用WriteToFile时手动追加了vbNewLine,同时StreamWriter.WriteLine方法会自动添加换行符,导致文件中出现多余空行。频繁IO操作(非致命但不规范)
每次调用WriteToFile都重复打开、关闭文件句柄,不仅效率低,还存在潜在的文件锁定风险。
修复后的代码示例
方案1:修正读取逻辑并优化写入方法
Dim fileEntries As String() = Directory.GetFiles(path) For Each fileName As String In fileEntries WriteToFile("fileName: " + fileName) ' 移除手动添加的vbNewLine Dim lines() As String = File.ReadAllLines(fileName) ' 改用ReadAllLines一次性读取所有行 For Each line As String In lines WriteToFile(line) ' 移除手动添加的vbNewLine Next Next
优化WriteToFile方法,利用Using块自动管理文件资源:
Public Sub WriteToFile(StrToWrite As String) Using stream As New IO.StreamWriter(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "MyFile.txt"), True) stream.WriteLine(StrToWrite) End Using ' 自动完成Flush、Close操作 End Sub
方案2:高效批量写入(推荐)
一次性打开输出文件,批量写入所有内容,避免频繁IO操作:
Dim outputFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "MyFile.txt") Using outputStream As New IO.StreamWriter(outputFilePath, True) Dim fileEntries As String() = Directory.GetFiles(path) For Each fileName As String In fileEntries outputStream.WriteLine("fileName: " + fileName) ' 直接遍历File.ReadLines结果,无需转换为数组 For Each line As String In File.ReadLines(fileName) outputStream.WriteLine(line) Next Next End Using
内容的提问来源于stack exchange,提问作者Privesh
相关产品推荐
相关产品推荐

