2009-09-25 6 views
0

이것은 ftp 서버에서 파일을 다운로드하기위한 스레드에서 실행되는 샘플 코드입니다. 그 안에, 사용자가 파일 다운로드를 멈추고 싶으면, 나는 스레드를 중단하려고했습니다. while 루프에서 컨트롤을 끊으면 끊습니다.FTP 파일 다운로드를 중지하십시오.

 How to close the binaryreader and Stream, when reader in the middle of stream 

    Using response As FtpWebResponse = CType(ftp.GetResponse, FtpWebResponse) 
       Using input As Stream = response.GetResponseStream() 
         Using reader As New BinaryReader(input) 
          Try 
           Using writer As New BinaryWriter(File.Open(targetFI.FullName, FileMode.Create)) 'output) 
            Dim buffer(2048) As Byte '= New Byte(2048) 
            Dim count As Integer = reader.Read(buffer, 0, buffer.Length) 
            While count <> 0 
             writer.Write(buffer, 0, count) 
             count = reader.Read(buffer, 0, buffer.Length) 
            End While 
            writer.Close() 
           End Using 

          Catch ex As Exception 
           'catch error and delete file only partially downloaded 
           targetFI.Delete() 
           'Throw 
           ret = False 
          End Try 
          reader.Close() 
         End Using 

         input.Close() 
        End Using 

      response.Close() 
      End Using 

답변

1
당신은 특정 조건 (귀하의 경우, 사용자가 다운로드를 중단하고자하는) 여부를 확인하기 위해 While 루프 내에서 "폴링"을 추가해야합니다

는 사실이다. 조건이 true이면 while 루프를 종료 할 수 있습니다.

예를 들어 사용자가 다운로드를 중지하려고 할 때 호출되는 함수가있을 수 있습니다 (이는 아마도 사용자 인터페이스 또는 일부 메커니즘에서 Button 클릭에 대한 응답 일 것입니다).

클래스 수준 부울 변수 (또는 속성)를 사용하면 다운로드를 중단하려는 사용자에 대한 응답으로이 변수를 true로 설정 한 다음 FTP 응답 스트림에서 파일의 일부를 읽는 루프 while 루프 내에서 간단하게 설정할 수 있습니다 ,이 변수의 값을 확인하고 truewhile 루프에서 단순히 종료의 경우 : 예를 들어

: 어딘가에 클래스 수준에서

, 당신은 선언 :

Dim blnAbort as Boolean = False 
사용자가 (예를 들어) 다운로드를 중지하려면 버튼을 클릭

는 :

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
     blnAbort = True 
    End Sub 

그리고 루프 동안 당신의 질문의 코드에서 메인에

, 당신은 추가

While count <> 0 
    ' Check the value of the blnAbort variable. If it is true, the user wants to abort, so we exit out of our while loop' 
    If blnAbort = True Then 
    Exit While 
    End If 
    writer.Write(buffer, 0, count) 
    count = reader.Read(buffer, 0, buffer.Length) 
End While 

이가이다 기본 메커니즘 (polling)을 사용하여 장기 실행 프로세스를 중단해야합니다. 물론, 중단의 경우에 관련 정리 코드가 수행되도록해야합니다 (사용자가 이미 수행중인 독자와 작성자를 닫는 경우). Windows Forms 기반 응용 프로그램의 컨텍스트에서이 작업을 수행하고 사용자 중단이 일부 GUI 상호 작용에 의해 제어되는 경우 while 루프에서 Application.DoEvents에 대한 호출을해야 할 수도 있습니다. 이렇게하면 (예를 들어) 버튼 클릭으로 생성 된 Windows 메시지가 적시에 처리되도록 할 수 있습니다.

+0

답장 보내 주셔서 감사합니다. 사실 나는 정확히 무슨 말을하는지. 하지만 중간에있을 때 리더를 닫을 수 없습니다. 즉 while 루프에서 제어합니다. 독자가 스트림 위치의 끝에 있지 않기 때문에. 따라서 독자를 닫기 전에 전체 스트림을 읽어야합니다. 이 문제를 해결하는 방법 –

+0

@Krishna - 제공 한 코드를 실행하려고했습니다. (하드 코드 된 값으로 누락 된 비트 몇 개를 채워야했습니다.) FTP 파일 다운로드를 "중단"하려고했습니다. 다운로드 중간. 그것은 나를 위해 잘 작동합니다. 여기에 사용한 VB 프로젝트 파일을 업로드했습니다 : http://tinyurl.com/y9ste3c – CraigTP

+0

(계속)이 프로젝트를 실행하는 경우 "시작"버튼을 클릭하고 FTP 다운로드가 다운로드를 시작하는 데 몇 초 동안 기다린 후 (C : \\에서 qqq.qqq라는 파일에 쓰고 있으므로 진행 상황을 모니터 할 수 있습니다) "취소"버튼을 클릭하면 전체 파일 (예 : 스트림)을 기다리지 않고 다운로드를 중단해야합니다) 다운로드를 마칩니다. – CraigTP

관련 문제