|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » VBA - [решено] Помогите исправить. |
|
VBA - [решено] Помогите исправить.
|
Пользователь Сообщения: 144 |
Профиль | Отправить PM | Цитировать В общем имеется исходники программы для вижуала и сама программа, ничего особенного в этой программе нет она просто скачивает файл и ложит его там же где и сама программа. При скачивании она жрёт столько ОЗУ сколько весит сам файл который скачивается в этом и проблема. Можно ли как-нибудь сделать так что бы файл не помещался в память а сразу же скачивался и был рядом с программой ? Подскажите в какую сторону копать ?
|
|
Отправлено: 14:56, 13-10-2013 |
Ветеран Сообщения: 1404
|
Профиль | Отправить PM | Цитировать |
------- Отправлено: 05:07, 03-11-2013 | #11 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Пользователь Сообщения: 144
|
Профиль | Отправить PM | Цитировать mrcnn,
Так сделал в двух местах. Всё равно ошибка... |
Отправлено: 13:06, 03-11-2013 | #12 |
Ветеран Сообщения: 1404
|
Профиль | Отправить 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 |
------- Отправлено: 19:31, 03-11-2013 | #13 |
Пользователь Сообщения: 144
|
Профиль | Отправить PM | Цитировать mrcnn, Немного не понял...в коде же ничего не изменено...
|
Отправлено: 23:30, 03-11-2013 | #14 |
Ветеран Сообщения: 1404
|
Профиль | Отправить PM | Цитировать Попробуйте оставить в неизменности функцию AsyncDownload, так как в ней не определено название файла, что является ошибкой. Если пишете об ошибке, то приведите ее текст. И программа не VBA а VB.NET
|
------- Отправлено: 06:20, 04-11-2013 | #15 |
Пользователь Сообщения: 144
|
Профиль | Отправить 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
|
Профиль | Отправить 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 |
------- Отправлено: 15:20, 04-11-2013 | #17 |
Пользователь Сообщения: 144
|
Профиль | Отправить PM | Цитировать mrcnn, работает спасибо, но у меня в программе раньше работал прогресс бар и показывалось в процентах сколько скачался файл, а теперь не работает...
Ой, извините, не заметил закомментированные строки. Раскоментил, всё работает спасибо. Но когда работает прогресс бар и показывается процент скачивания, то память начинает жрать по жёсткому...Почему так происходит ? |
Последний раз редактировалось by_gangster, 04-11-2013 в 18:11. Отправлено: 17:49, 04-11-2013 | #18 |
Ветеран Сообщения: 1404
|
Профиль | Отправить PM | Цитировать Потому что делает по-старому.
Память занимает строка all.AddRange(bts). Функция DownloadSuccess(all) делает по-старому запись файла из буфера в памяти (добавление в этот буфер all.AddRange(bts) ) , поэтому ее нужно закомментировать. Прогресс показывает функция ReceiveProgressInvoke(all.Count) по событию ReceiveProgress, а она не закомментирована. |
------- Отправлено: 01:52, 05-11-2013 | #19 |
Пользователь Сообщения: 144
|
Профиль | Отправить PM | Цитировать mrcnn, Если закомментирована строка all.AddRange(bts) то прогресс-бар не работает.
|
Отправлено: 20:23, 05-11-2013 | #20 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Ошибка - помогите исправить данную ошибку | 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 |
|