I want to copy the file into small pieces (to cancel the copy operation, if necessary).
I am trying to execute an unlabeled solution here: How to copy a file with the ability to undo a copy?
But I get a file with 0 bytes
What am I doing wrong?
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
**
UPDATE 1:
**
I tried to follow the Virtlink response steps and put the missing parts in my source code, but I still get a null byte.
> 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
**
UPDATE 2:
**
MY LAST FAILURE AGAINST:
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
**
UPDATE 3:
**
DECISION
The problem was in VB.NET. I cannot assign a value to a variable in a loop condition, so this is a working 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