2013-03-21 4 views
1

작은 청크로 파일을 복사하고 싶습니다 (필요한 경우 복사 작업을 취소).작은 덩어리로 파일 복사

나는 여기에 표시되지 않은 솔루션을 따라하기 위해 노력하고있어 : 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 

**

UPDATE 1 :

** 내가 Virtlink 응답의 단계를 수행하고 내 원래의 코드에서 누락 된 부분을 넣어하는 tryed했습니다

,하지만 난 여전히 0 바이트 파일을 받고.

> 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 :

**

MY 최근의 실패 TRY :

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 
,691,363 (210)

**

UPDATE 3 :

**

솔루션

나는에 값을 할당 할 수 없습니다 VB.NET에 있었다 문제 루프 조건의 변수입니다. 따라서 Sub가 작동합니다. 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 
+1

다음 단 하나의 아웃 쓰기 :이 내 컴퓨터에서 작동합니다. 분명히 올바른 코드가 아닙니다. –

+0

그 이유는 내가 올바른 방법을 모르는 때문에 질문을 물어 이유지만, 적어도 내가 검색하고 물어 전에 그것을 tryed했습니다, 당신은 정말 downvote과 클로저 자격이 있다고 생각한다면 ... 음, 어쨌든 코멘트를 위해. – ElektroStudios

+1

링크 된 코드 줄을 올바르게 번역하지 않았습니다. 나는 그 코드를 다시 보는 것이 좋습니다. –

답변

5

당신이하는 일과 그것이 어떻게 작동하는지 이해해야합니다.

먼저 버퍼를 할당합니다.

Dim buffer = New Byte(1024) {} 

그런 다음 입력 스트림에서 일부 데이터를 읽습니다. 데이터는 0부터 최대 buffer.Length 바이트까지 인 buffer에 저장됩니다. 이 메소드는 얼마나 많은 바이트를 가지고 있는지를 으로 나타내며 실제로는을 읽고 버퍼에 넣는다.

bytesRead = inputStream.Read(buffer, 0, buffer.Length) 

읽은 바이트 수가 0보다 큰 경우 아직 파일 끝에 도달하지 않았습니다.

While (bytesRead > 0) 

그런 다음 당신은 출력 스트림 (bytesRead 바이트)를 읽은 정확히 그 바이트를 작성합니다. buffer에서 바이트를 쓰고 인덱스 0에서 시작하여 bytesRead 바이트 수를 씁니다.

효율성 때문에 사용자가 작성한 내용이 버퍼에 저장되므로 출력 스트림을 플러시하고 닫아야합니다.

outputStream.Flush() 
outputStream.Close() 

함께 퍼팅 : 나는 VB를 썼다

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() 

마지막 시간이 10 년 전 이상입니다. 구문이 올바른지 확인해야합니다.

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 
+0

도와 주셔서 감사합니다. 귀하의 도움과 의견을 많이 보내 주셔서 감사합니다.하지만 귀하의 조치를 따라 왔으며 여전히 0 점을 받았습니다. 내 질문을 업데이트했습니다. 다시 감사하십시오. – ElektroStudios

+0

@ElektroHacker 답변을 업데이트했습니다. – Virtlink

+0

예 오류/예외없이 컴파일하고 0 바이트 파일을 만듭니다. 잠시 동안 말한 괄호를 추가하여 tryed했지만 아무것도 변경되지 않았습니다. 위의 코드는 괄호로만 묶인 것입니다. – ElektroStudios