Vb.net 尝试在读取行后关闭文本文件

Vb.net 尝试在读取行后关闭文本文件,vb.net,Vb.net,我试图将文本文件第二行的数据输出到datagridview,但这样做时,它也会输出第二行之后的每一行。这就是我尝试过的。谢谢 Dim lines = IO.File.ReadAllLines(OrderID & ".txt") For index = 1 To lines.Length - 1 Dim cells = lines(index).Split(","c) dgvOutput.Rows.Add(ce

我试图将文本文件第二行的数据输出到datagridview,但这样做时,它也会输出第二行之后的每一行。这就是我尝试过的。谢谢

        Dim lines = IO.File.ReadAllLines(OrderID & ".txt")
        For index = 1 To lines.Length - 1
            Dim cells = lines(index).Split(","c)
            dgvOutput.Rows.Add(cells)
            FileClose()

循环在所有行上执行,只跳过第一行。
虽然我看不到FileClose调用中发生了什么,但似乎没有任何意义,因为ReadAllLines已经关闭了该文件

您可以用一行代码获得文件的第二行

Dim line as String = File.ReadLines(OrderID & ".txt").Skip(1).Take(1).FirstOrDefault()

' this check is required to avoid problems with files containing 0 or 1 line
if line IsNot Nothing Then
    Dim cells = line.Split(","c)
    dgvOutput.Rows.Add(cells)
End If

请注意,我已将ReadAllLines替换为ReadLines。这是更好的,因为当您只需要第二行(如果存在)时,使用此方法不会读取所有行。更多信息,在第二行之后,它将输出每一行,因为当您遍历ReadAllLines返回的字符串数组时,您会告诉它这样做

IO.File.ReadAllLines不会使输出流保持打开状态。文件已关闭。它所做的是返回一个文件内容的零基(默认)数组,其中换行符是分割的分隔符

要使用ReadAllLines获取第二行的内容,您需要:

Dim lines = IO.File.ReadAllLines(OrderID & ".txt")
If lines.length >= 2 Then 
   Dim cells = lines(1).Split(","c)
   dgvOutput.Rows.Add(cells) 
End If 
现在,这确实有读取整个文件的开销。如果使用reader对象打开文件,则只需读取文件的第一行和第二行即可获得第二行

可能是这样的:

Dim reader as StreamReader = My.Computer.FileSystem.OpenTextFileReader(OrderId & ".txt")
Dim a as String
' This reads the first line, which we throw away 
reader.ReadLine()
a = reader.ReadLine()
reader.Close()
Dim cells = a.Split(","c)
dgvOutput.Rows.Add(cells) 
您需要测试您的明确环境,以确定哪一个更适合您正在尝试做的事情

Dim lines = IO.File.ReadAllLines(OrderID & ".txt")
Dim SecondLine = lines(1)

File.ReadAllLines为您打开和关闭文件,因此无需添加代码来关闭它。

下一个
在哪里?请提供一个最小的、完整的、可验证的例子。请你解释一下这个问题与你之前的问题有什么不同。您想读取从第二行开始的所有行还是仅从第二行开始的所有行?一个小问题:当您调用
Take(1)
时,将不会有多行,因此
SingleOrDefault
将比
FirstOrDefault
更合适。