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

VB窗体关闭后CSV文件仍被应用占用的问题求助

问题原因

你代码中的StreamReader对象读取完CSV文件后没有被正确释放,导致文件句柄一直被占用。因为你仅创建了sr实例但未调用Close()或Dispose()方法,且未处理异常场景下的资源释放,所以即便关闭窗体,文件也会被锁定,直到垃圾回收器自动回收该资源。

修复方案

推荐使用Using语句包裹StreamReader,它会在代码块结束后自动释放资源(无论是否发生异常),这是VB.NET中处理资源的最佳实践。

修改后的代码:

Private Sub Btn_brow_Click(sender As Object, e As EventArgs) Handles Btn_brow.Click
    Dim ofd As New OpenFileDialog
    Dim dt As New DataTable

    Try
        With ofd
            .Filter = "CSV files(*.csv)|*.csv"
            .FilterIndex = 1
            .Title = "Import data from CSV File"
        End With
        If ofd.ShowDialog() = DialogResult.OK Then
            txtLocation.Text = ofd.FileName

            ' 使用Using语句自动释放StreamReader资源
            Using sr As New IO.StreamReader(ofd.FileName)
                Dim newline() As String = sr.ReadLine.Split(";"c)
                dt.Columns.AddRange({New DataColumn(newline(0)), New DataColumn(newline(1)), New DataColumn(newline(2)), New DataColumn(newline(3))})
                While (Not sr.EndOfStream)
                    newline = sr.ReadLine.Split(";"c)
                    Dim newrow As DataRow = dt.NewRow
                    newrow.ItemArray = {newline(0), newline(1), newline(2), newline(3)}
                    dt.Rows.Add(newrow)
                End While
                Dgv_Import.DataSource = dt
            End Using ' 自动调用sr.Dispose(),释放文件句柄
        End If
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try
End Sub

如果不想使用Using,也可以手动调用Close()和Dispose(),但需确保所有执行路径(包括异常场景)都能触发资源释放:

' 读取完成后添加:
sr.Close()
sr.Dispose()

' 同时在Catch块中补充处理:
Catch ex As Exception
    If sr IsNot Nothing Then
        sr.Close()
        sr.Dispose()
    End If
    MessageBox.Show(ex.Message)

相比手动释放,Using方式更简洁安全,无需手动处理各类边界情况。

内容的提问来源于stack exchange,提问作者GuidoM.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 01:57:59