读取文件流问题

Reading a filestream issue

我正在尝试从我的计算机读取文件并将其内容输出到文字控件中。它给出了错误:Offset and length were out of bounds for the array or count is greater than the number of elements from index to the end of the source collection. 这是我第一次使用 FileStream,我不是 100% 了解 VB 的所有语法,或者是否有社区首选的文件读取方式,但是有人可以帮我解决这个错误吗?

这是代码:

 Using fs As New FileStream(_path, FileMode.Open, FileAccess.Read)
                Try
                    Dim fileLength As Integer = CInt(fs.Length)
                    Dim buffer() As Byte = New Byte() {fileLength}
                    Dim count As Integer
                    Dim sum As Integer = 0

                    While ((count = fs.Read(buffer, sum, fileLength - sum)) > 0)
                        sum = sum + count
                    End While
                    litOutput.Text = buffer.ToString()
                Catch ex As Exception
                    'TODO: log error
                End Try
            End Using

这一行是错误的

Dim buffer() As Byte = New Byte() {fileLength}

它声明了一个 1 字节的数组,您尝试在其中存储文件的长度。可能您将 Option Strict 设置为 Off,因此您可能会在没有立即注意到问题的情况下离开。

当然,如果你的文件长度合理,而且是一个简单的文本文件,那么就不需要这个循环。只需使用 File.ReadAllText or File.ReadLines or File.ReadAllLines,顺便说一下,您的代码会在一次调用中读取所有数据,因为 FileStream.Read 的最后一个参数是要从文件和表达式 fileLength - sum 中读取的字节数在一次调用中产生读取所有字节的请求

相反,如果您想以特定大小的块读取文件,那么 可能你需要

Using fs As New FileStream(path, FileMode.Open, FileAccess.Read)
    Try
        Dim chunkSize = 2000
        Dim fileLength As Integer = CInt(fs.Length)
        Dim buffer(fileLength) as Byte
        Dim blockSize(chunkSize) as Byte
        Dim count As Integer = -1
        Dim pos As Integer = 0

        While count <> 0
            count = fs.Read(blockSize, 0, chunkSize-1)
            Array.Copy(blockSize, 0, buffer, pos, count)
            pos += count
        End While

        litOutput.Text = Encoding.UTF8.GetString(buffer)
    Catch ex As Exception
        Console.WriteLine(ex.Message)
    End Try
End Using

请注意,此代码假定您的文件是采用 UTF8 编码的文本文件。
如果不是这种情况,那么您可以尝试使用 Encoding.ASCII.GetStringEncoding.Unicode.GetString