Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Помогите пожалуйста по VB (http://forum.oszone.net/showthread.php?t=304044)

by_gangster 16-08-2015 14:00 2542270

Помогите пожалуйста по VB
 
В общем имеется код, который скачивает файл с интернета сначала в память, а потом в конце кладёт его в папку. После того как он его скачал все функции дальше работают нормально.

Код:

        ' Получить асинхронно
        If WaitForDownload = False Then
            thr = New Threading.Thread(AddressOf AsyncDownload)
            thr.Start(myHttpWebResponse.GetResponseStream)

            ' Получить синхронно
        Else
            FileDownloading = True
            Dim myStreamReader As New IO.BinaryReader(myHttpWebResponse.GetResponseStream)
            Dim all As New System.Collections.Generic.List(Of Byte)
            Do
                ' Собственно получения порции данных
                Dim bts() As Byte = myStreamReader.ReadBytes(BufferSize)
                If bts.Length = 0 Then Exit Do
                all.AddRange(bts)
                ' Вызов события Идет прием данных
                ReceiveProgressInvoke(all.Count)
            Loop
            DownloadSuccess(all)
        End If
    End Sub
    ' Функция реализующая поток, который скачивайт файл порциями BufferSize
    Sub AsyncDownload(ByVal stream As Object)
        FileDownloading = True
        Dim myStreamReader As New IO.BinaryReader(stream)
        Dim all As New System.Collections.Generic.List(Of Byte)
        Do
            ' Всякие Прерывания и Паузы потока
            If FileDownloading = False Then DownloadCancelledInvoke() : myStreamReader.Close() : Exit Sub
            While DownloadPause
                System.Windows.Forms.Application.DoEvents()
                If FileDownloading = False Then DownloadCancelledInvoke() : myStreamReader.Close() : Exit Sub
            End While

            ' Собственно получения порции данных
            Dim bts() As Byte = myStreamReader.ReadBytes(BufferSize)
            If bts.Length = 0 Then Exit Do
            all.AddRange(bts)
            ' Вызов события Идет прием данных
            ReceiveProgressInvoke(all.Count)
        Loop
        DownloadSuccess(all)
    End Sub
    Delegate Sub dDownloadSuccess(ByVal lst As System.Collections.Generic.List(Of Byte))
    Sub DownloadSuccess(ByVal lst As System.Collections.Generic.List(Of Byte))
        If Me.InvokeRequired Then
            Dim d As New dDownloadSuccess(AddressOf DownloadSuccess)
            Me.Invoke(d, New Object() {lst})
        Else
            ' Собственно завершение загрузки
            IO.File.WriteAllBytes(FlName, lst.ToArray)
            ResultQuery = FlName

            ' Снимаем синхблок
            FileDownloading = False

            ' Вызов события ПолученОтвет
            RaiseEvent ReceivedResponse(Me, New EventArgs)
        End If
    End Sub

Есть ещё один код, тоже самое скачивает файл с интернета, но не в память, а сразу кладёт его в папку и качает, проблема этого кода в том что после того как он скачал не выполняются следующие операции.

Пишет ошибку.
Произошла непредвиденная ошибка. Невозможно обратится к файлу.
Проверьте правильность написания пути Ошибка: Недопустимый вызов или аргумент процедуры.

Код:

        ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        'Открыть файл

        ' Поток в файл (объявление)
        Dim fstr As New System.IO.FileStream(FlName, System.IO.FileMode.Create)
        Dim dnl_size As Long = 0


        'Открытие потока в файл
        'fstr = System.IO.File.OpenWrite(FlName)
        ' Получить асинхронно
        If WaitForDownload = False Then

            fstr.Close()
            thr = New Threading.Thread(AddressOf AsyncDownload)
            thr.Start(myHttpWebResponse.GetResponseStream)

            ' Получить синхронно
        Else
            FileDownloading = True
            Dim myStreamReader As New IO.BinaryReader(myHttpWebResponse.GetResponseStream)
            Dim all As New System.Collections.Generic.List(Of Byte)
            Do
                ' Собственно получения порции данных
                Dim bts() As Byte = myStreamReader.ReadBytes(BufferSize)
                If bts.Length = 0 Then Exit Do
                fstr.Seek(0, System.IO.SeekOrigin.End)
                For Each bytevalue As Byte In bts
                    fstr.WriteByte(bytevalue)
                    fstr.Seek(0, System.IO.SeekOrigin.End)
                    dnl_size = dnl_size + 1
                Next
                'all.AddRange(bts)
                ' Вызов события Идет прием данных
                ReceiveProgressInvoke(dnl_size)
            Loop
            DownloadSuccess2()
            fstr.Close()
        End If
    End Sub
    ' Функция реализующая поток, который скачивайт файл порциями BufferSize
    Sub AsyncDownload(ByVal stream As Object)
        FileDownloading = True
        Dim myStreamReader As New IO.BinaryReader(stream)
        Dim all As New System.Collections.Generic.List(Of Byte)

        Dim fstr As New System.IO.FileStream(FlName, System.IO.FileMode.Create)
        Dim dnl_size As Long = 0

        Do
            ' Всякие Прерывания и Паузы потока
            If FileDownloading = False Then DownloadCancelledInvoke() : myStreamReader.Close() : Exit Sub
            While DownloadPause
                System.Windows.Forms.Application.DoEvents()
                If FileDownloading = False Then DownloadCancelledInvoke() : myStreamReader.Close() : Exit Sub
            End While
            ' Собственно получения порции данных
            Dim bts() As Byte = myStreamReader.ReadBytes(BufferSize)
            If bts.Length = 0 Then Exit Do
            fstr.Seek(0, System.IO.SeekOrigin.End)
            For Each bytevalue As Byte In bts
                fstr.WriteByte(bytevalue)
                fstr.Seek(0, System.IO.SeekOrigin.End)
                dnl_size = dnl_size + 1
            Next

            'all.AddRange(bts)
            ' Вызов события Идет прием данных
            ReceiveProgressInvoke(dnl_size)
        Loop
        DownloadSuccess2()
        fstr.Close()
    End Sub '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Delegate Sub dDownloadSuccess(ByVal lst As System.Collections.Generic.List(Of Byte))
    Sub DownloadSuccess2()
        ' Собственно завершение загрузки
        ResultQuery = FlName
        ' Снимаем синхблок
        FileDownloading = False

        ' Вызов события ПолученОтвет
        RaiseEvent ReceivedResponse(Me, New EventArgs)

    End Sub

Сам в этом не сильно разбираюсь.


Время: 01:59.

Время: 01:59.
© OSzone.net 2001-