我想以小块的形式复制文件(如果需要,取消复制操作)。
我正在尝试按照此处未标记的解决方案:How to copy a file with the ability to cancel the copy?
但我得到一个0字节的文件
我做错了什么?
Public Class Form1
Dim cancelled As Boolean = Nothing
Dim input = New System.IO.FileStream("C:\1.txt", System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read)
Dim output = New System.IO.FileStream("C:\Nueva carpeta\1.txt", System.IO.FileMode.CreateNew, System.IO.FileAccess.Write, System.IO.FileShare.Write)
Public Sub CopyStream(ByVal inputStream As System.IO.Stream, ByVal outputStream As System.IO.Stream)
'Dim buffer = System.IO.File.ReadAllBytes("C:\1.txt")
Dim buffer = New Byte((1024) - 1) {}
Dim bytesRead As Integer = 1
While (inputStream.Read(buffer, 0, buffer.Length) > 0)
outputStream.Write(buffer, 0, bytesRead)
'bytesRead += 1
If cancelled Then
MsgBox("operacion cancelada")
Return
End If
End While
inputStream.Close()
outputStream.Close()
MsgBox("operacion terminada")
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
CopyStream(input, output)
End Sub
End Class
**
更新1:
**
我已经尝试按照Virtlink答案的步骤并将缺少的部分放在原始代码中,但我仍然得到一个零字节文件。
> Public Class Form1
Dim input = New System.IO.FileStream("C:\Test.txt", System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read)
Dim output = New System.IO.FileStream("C:\Test_New.txt", System.IO.FileMode.CreateNew, System.IO.FileAccess.Write, System.IO.FileShare.Write)
Public Sub CopyStream(ByVal inputStream As System.IO.Stream, ByVal outputStream As System.IO.Stream)
Dim buffer = New Byte(1024) {}
Dim bytesRead As Integer
' Read some bytes
While (bytesRead = inputStream.Read(buffer, 0, buffer.Length) > 0)
' Write them to the output
outputStream.Write(buffer, 0, bytesRead)
End While
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
CopyStream(input, output)
End Sub
End Class
**
更新2:
**
我最近的失败尝试:
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim input_filepath As String = "C:\Test.txt", output_filepath As String = "C:\Test_New.txt"
Dim input = New System.IO.FileStream(input_filepath, System.IO.FileMode.Open, System.IO.FileAccess.ReadWrite)
Dim output = New System.IO.FileStream(output_filepath, System.IO.FileMode.Create, System.IO.FileAccess.ReadWrite)
CopyStream(input, output)
' For Testing:
If New IO.FileInfo(output_filepath).Length = 0 Then IO.File.Delete(output_filepath) : Application.Exit() Else Process.Start("Notepad", output_filepath)
End Sub
Public Sub CopyStream(ByVal inputStream As System.IO.Stream, ByVal outputStream As System.IO.Stream)
Dim buffer = New Byte(1024) {}, bytesRead As Integer
While ((bytesRead = inputStream.Read(buffer, 0, buffer.Length)) > 0)
outputStream.Write(buffer, 0, bytesRead)
End While
inputStream.Flush() : outputStream.Flush()
inputStream.Close() : outputStream.Close()
End Sub
End Class
**
更新3:
**
解
问题出在VB.NET中我无法在循环条件中为变量赋值,所以这就是工作Sub:
Public Sub CopyStream(ByVal inputStream As Stream, ByVal outputStream As Stream)
Dim buffer = New Byte(1025) {}
Dim bytesRead As Integer = 0
Do
bytesRead = inputStream.Read(buffer, 0, buffer.Length)
If bytesRead > 0 Then
outputStream.Write(buffer, 0, bytesRead)
End If
Loop While (bytesRead > 0)
outputStream.Flush()
inputStream.Close() : outputStream.Close()
End Sub
答案 0 :(得分:6)
你必须了解你正在做什么以及它是如何运作的。
首先,分配一个缓冲区。
Dim buffer = New Byte(1024) {}
然后你去读取输入流中的一些数据。数据放在buffer
中,从0
开始,最多buffer.Length
个字节。该方法返回实际读取并放入缓冲区的字节数。
bytesRead = inputStream.Read(buffer, 0, buffer.Length)
如果您读取的字节数大于0,那么您还没有到达文件的末尾。
While (bytesRead > 0)
然后,您将那些读取的字节(bytesRead
字节)写入输出流。从buffer
写入字节,从索引0
开始,写入bytesRead
字节数。
outputStream.Write(buffer, 0, bytesRead)
由于流因为效率原因会缓冲您编写的内容,因此您必须刷新并关闭输出流。
outputStream.Flush()
outputStream.Close()
把它放在一起:
Dim buffer = New Byte(1024) {}
Dim bytesRead As Integer
' Read some bytes
While ((bytesRead = inputStream.Read(buffer, 0, buffer.Length)) > 0)
' Write them to the output
outputStream.Write(buffer, 0, bytesRead)
If cancelled Then
MsgBox("operacion cancelada")
Return
End If
' Repeat
End
outputStream.Flush()
outputStream.Close()
我最近一次写VB是十多年前的事了。您必须确保语法正确。
请注意原始代码如何包含此行:
While ((bytesRead = inputStream.Read(buffer, 0, buffer.Length)) > 0)
您看到bytesRead =
部分了吗?您尚未将其复制到代码中。必须存储读取的字节数。
最终代码:这适用于我的电脑:
Imports System
Imports System.IO
Namespace ConsoleApplication1
Friend Class Program
Private Shared Sub Main(args As String())
Program.CopyMyFiles()
Console.WriteLine("DONE!")
Console.ReadLine()
End Sub
Private Shared Sub CopyMyFiles()
Dim input_filepath As String = "Test.txt"
Dim output_filepath As String = "Test_New.txt"
Dim input As FileStream = New FileStream(input_filepath, FileMode.Open, FileAccess.ReadWrite)
Dim output As FileStream = New FileStream(output_filepath, FileMode.Create, FileAccess.ReadWrite)
Program.CopyStream(input, output)
End Sub
Public Shared Sub CopyStream(inputStream As Stream, outputStream As Stream)
Dim buffer As Byte() = New Byte(1025)
Dim bytesRead As Integer
bytesRead = inputStream.Read(buffer, 0, buffer.Length)
While bytesRead > 0
outputStream.Write(buffer, 0, bytesRead)
bytesRead = inputStream.Read(buffer, 0, buffer.Length)
End While
outputStream.Flush()
inputStream.Close()
outputStream.Close()
End Sub
End Class
End Namespace