#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 КБ»