停止FTP文件下载

时间:2009-09-25 10:57:03

标签: vb.net

这是我在线程下运行的示例代码,用于从ftp服务器下载文件。在那,如果用户想要停止文件下载,我试图中止该线程。如果在while循环中控件,则挂起。

     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 个答案:

答案 0 :(得分:1)

您需要在While循环中添加“轮询”以检查某个条件(在您的情况下,用户是否希望中止下载)是否为真。如果条件为真,则可以退出while循环。

例如,您可能会在用户希望停止下载时调用一个函数(这可能是为了响应用户界面上的Button单击或某些此类机制)。

使用类级别布尔变量(或属性),您可以简单地将此变量设置为true以响应希望中止下载的用户,然后在您的while循环中将读取文件的部分内容FTP响应流,您检查此变量的值,如果它是true,您只需退出while循环:

例如:

在班级某处,您声明:

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循环中,添加:

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窗体的应用程序的上下文中完成此操作,您可能还需要在while循环中调用Application.DoEvents,并且用户中止由一些GUI交互之王控制。这将确保(例如)按钮单击生成的Windows消息得到及时处理。