Чтение большого файла, начиная с байтовой позиции и записывая его в новый файл, vb.net

#vb.net #filestream

#vb.net #поток файлов

Вопрос:

У меня есть этот код для чтения больших файлов и записи их в байтах с использованием буфера, я хочу прочитать определенный размер. например, у меня есть файл размером 100 КБ. Я хочу прочитать только последние 30 КБ и сохранить их в новый файл. Я также не совсем понимаю, как работает этот ридер, но я хочу использовать его, чтобы он не мог загрузить весь файл в память.

  Sub readthis(filein As String, fileout As Of String, startingposition as integer)
        Dim bytesRead As Integer
        Dim buffer(4096) As Byte
        Using inFile As New IO.FileStream(filein, FileMode.Open)
            Using outFile As New IO.FileStream(fileout, FileMode.Append, FileAccess.Write)
                Do
                    bytesRead = inFile.Read(buffer, 0, buffer.Length)
                    If bytesRead > 0 Then
                        outFile.Write(buffer, 0, bytesRead)
                    End If
                Loop While bytesRead > 0
            End Using
        End Using
    End Sub
 

Комментарии:

1. inFile.Seek(startingposition, SeekOrigin.Begin) . Откуда это fileout.Item(i) происходит? Это имя файла, просто передайте fileout . Почему вы используете FileMode.Append ?

2. да, извините. я отредактировал его. итак, где я могу использовать inFile.Seek(startingposition, SeekOrigin.Begin)

3. Прежде чем вы начнете чтение из этого потока.

4. хорошо, это работает, но мне нужно, чтобы это работало на том же exe. предположим filein , что это само это приложение, оно не работает, потому что приложение уже открыто. как я могу преодолеть эту проблему?

Ответ №1:

Попробуй это:

 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    readthis("d:logtmp1.txt", "d:logtmp2.txt", 30)

End Sub

Sub readthis(filein As String, fileout As String, numlastbytes As Integer)

    Dim fs As New IO.FileStream(filein, FileMode.Open, FileAccess.Read)
    fs.Seek(-numlastbytes, SeekOrigin.End)
    Dim bytearray(numlastbytes) As Byte
    Dim numbytesread As Integer = fs.Read(bytearray, 0, numlastbytes)
    fs.Close()
    My.Computer.FileSystem.WriteAllBytes(fileout, bytearray, False)

End Sub
 

Комментарии:

1. Да, потому что вы спросили «Я хочу прочитать последние 30 КБ»