Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » VBA - [решено] Помогите исправить.

Ответить
Настройки темы
VBA - [решено] Помогите исправить.

Пользователь


Сообщения: 144
Благодарности: 3

Профиль | Отправить PM | Цитировать


В общем имеется исходники программы для вижуала и сама программа, ничего особенного в этой программе нет она просто скачивает файл и ложит его там же где и сама программа. При скачивании она жрёт столько ОЗУ сколько весит сам файл который скачивается в этом и проблема. Можно ли как-нибудь сделать так что бы файл не помещался в память а сразу же скачивался и был рядом с программой ? Подскажите в какую сторону копать ?

Отправлено: 14:56, 13-10-2013

 

Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата by_gangster:
mrcnn, Если закомментирована строка all.AddRange(bts) то прогресс-бар не работает. »
Перепишите так, чтобы «прогресс-бар» использовал другой метод подсчёта, нежели опрос размера объекта «all».
Это сообщение посчитали полезным следующие участники:

Отправлено: 04:55, 06-11-2013 | #21



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 1404
Благодарности: 135

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
' Получить собственно файл
        If PathForDownl = "" Then
            FlName = IO.Path.GetTempPath & IO.Path.GetFileName(fl)
        Else
            PathForDownloads = GetMaxPath(PathForDownloads)
            If IO.Directory.Exists(PathForDownloads) = False Then
                IO.Directory.CreateDirectory(PathForDownloads)
            End If
            FlName = PathForDownloads & "\" & IO.Path.GetFileName(fl)
        End If
        If IO.Path.GetFileName(FlName).Split(IO.Path.GetInvalidFileNameChars).Length > 1 Then
            FlName = IO.Path.GetTempPath & GetUIN() & ".tmp"
        End If

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

' Поток в файл (объявление)
Dim  fstr As New System.IO.FileStream(FlName,  System.IO.FileMode.OpenOrCreate)
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




            'DownloadSuccess(all)
        End If

' Функция реализующая поток, который скачивайт файл порциями 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.OpenOrCreate)
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
        'DownloadSuccess(all)
    End Sub

-------
Ehhh.. what's up, doc?..

Это сообщение посчитали полезным следующие участники:

Отправлено: 15:36, 06-11-2013 | #22


Пользователь


Сообщения: 144
Благодарности: 3

Профиль | Отправить PM | Цитировать


mrcnn, Спасибо тебе огромное, побольше бы таких людей.

Отправлено: 00:10, 07-11-2013 | #23


Пользователь


Сообщения: 144
Благодарности: 3

Профиль | Отправить PM | Цитировать


mrcnn,
Проблема в том что когда файл полностью скачался программа просто напросто показывает 100% и не завершает закачку. Выход только один - это закрыть программу. Пробовал раскоментить DownloadSuccess(all) тогда программа в конце просто напросто выдаёт ошибку и всё. Помогите пожалуйста.

Отправлено: 19:19, 16-12-2013 | #24


Ветеран


Сообщения: 1404
Благодарности: 135

Профиль | Отправить PM | Цитировать


Там где вызывается DownloadSuccess попробуйте вызвать функцию DownloadSuccess2

Код: Выделить весь код
    Sub DownloadSuccess2()
            ' Собственно завершение загрузки
            ResultQuery = FlName
            ' Снимаем синхблок
            FileDownloading = False

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

    End Sub

-------
Ehhh.. what's up, doc?..

Это сообщение посчитали полезным следующие участники:

Отправлено: 02:20, 18-12-2013 | #25


Пользователь


Сообщения: 144
Благодарности: 3

Профиль | Отправить PM | Цитировать


mrcnn, Спасибо, всё сработало. А ещё скажите как можно сделать что бы после завершения загрузки программа больше не использовала файл. Т.е просто после загрузки файл нельзя открыть (его использует программа), можно только после закрытия программы. Что можно добавить после downloadsuccess2() для закрытия файла программой ?

Отправлено: 14:02, 18-12-2013 | #26


Ветеран


Сообщения: 1404
Благодарности: 135

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
fstr.Close()
после Loop перед закомментированным DownloadSuccess

-------
Ehhh.. what's up, doc?..


Отправлено: 23:25, 18-12-2013 | #27



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » VBA - [решено] Помогите исправить.

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Ошибка - помогите исправить данную ошибку simsa Microsoft Windows 2000/XP 2 26-11-2012 15:50
C/C++ - Помогите исправить ошибки!!!!! Nastasya Программирование и базы данных 2 23-05-2011 22:09
Помогите исправить ошибку! Guest Хочу все знать 1 15-05-2004 16:55
Помогите исправить ошибку! Guest Сетевые технологии 1 12-05-2004 10:11




 
Переход