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

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

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

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


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

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


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

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

 

Ветеран


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

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


Код: Выделить весь код
IO.File.WriteAllBytes(FlName, bts)
попробуйте добавить два раза перед
Код: Выделить весь код
all.AddRange(bts)
И закомментируйте вызов функции DownloadSuccess(all)

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

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

Отправлено: 05:07, 03-11-2013 | #11



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

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


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


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

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


mrcnn,
Код: Выделить весь код
 Dim bts() As Byte = myStreamReader.ReadBytes(BufferSize)
            If bts.Length = 0 Then Exit Do
            IO.File.WriteAllBytes(FlName, bts)
            all.AddRange(bts)
            ' Вызов события Идет прием данных
            ReceiveProgressInvoke(all.Count)
        Loop
        'DownloadSuccess(all)'
    End Sub
Так сделал в двух местах. Всё равно ошибка...

Отправлено: 13:06, 03-11-2013 | #12


Ветеран


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

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


В функции AsyncDownload не открыт файл. Открывается он следующим образом в начале функции

Код: Выделить весь код
' Получить собственно файл
        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

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

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

Отправлено: 19:31, 03-11-2013 | #13


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


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

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


mrcnn, Немного не понял...в коде же ничего не изменено...

Отправлено: 23:30, 03-11-2013 | #14


Ветеран


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

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


Попробуйте оставить в неизменности функцию AsyncDownload, так как в ней не определено название файла, что является ошибкой. Если пишете об ошибке, то приведите ее текст. И программа не VBA а VB.NET

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

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

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


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


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

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


mrcnn, Извините пожалуйста, но я уже дуб-дубом.. Можете сказать толком что в этом участке менять ?
Код: Выделить весь код
' Получить собственно файл
        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

        ' Получить асинхронно
        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

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


Ветеран


Сообщения: 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)



'Открытие потока в файл
'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)
Next



                'all.AddRange(bts)
                ' Вызов события Идет прием данных
                ReceiveProgressInvoke(all.Count)

            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)


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

            'all.AddRange(bts)

            ' Вызов события Идет прием данных
            ReceiveProgressInvoke(all.Count)

        Loop
        DownloadSuccess(all)
    End Sub

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

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

Отправлено: 15:20, 04-11-2013 | #17


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


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

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


mrcnn, работает спасибо, но у меня в программе раньше работал прогресс бар и показывалось в процентах сколько скачался файл, а теперь не работает...

Ой, извините, не заметил закомментированные строки. Раскоментил, всё работает спасибо.


Но когда работает прогресс бар и показывается процент скачивания, то память начинает жрать по жёсткому...Почему так происходит ?

Последний раз редактировалось by_gangster, 04-11-2013 в 18:11.


Отправлено: 17:49, 04-11-2013 | #18


Ветеран


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

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


Потому что делает по-старому.
Память занимает строка all.AddRange(bts).
Функция DownloadSuccess(all) делает по-старому запись файла из буфера в памяти (добавление в этот буфер all.AddRange(bts) ) , поэтому ее нужно закомментировать.
Прогресс показывает функция ReceiveProgressInvoke(all.Count) по событию ReceiveProgress, а она не закомментирована.

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

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

Отправлено: 01:52, 05-11-2013 | #19


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


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

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


mrcnn, Если закомментирована строка all.AddRange(bts) то прогресс-бар не работает.

Отправлено: 20:23, 05-11-2013 | #20



Компьютерный форум 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




 
Переход