GetChunk убивает файл...

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Stally
Начинающий
Начинающий
 
Сообщения: 14
Зарегистрирован: 19.12.2004 (Вс) 4:00

GetChunk убивает файл...

Сообщение Stally » 08.04.2005 (Пт) 2:44

Есть вот такой вот код. (не весь естественно, просто кусок)

If State = icResponseReceived Then
If Size = 0 Then Size = Inet1.GetHeader("Content-length")
Label1 = "Всего: " & Size: DoEvents
Do
On Error GoTo away
s = Inet1.GetChunk(10240, icByteArray)
If 0 = Len(s) Then Exit Do
got = got & StrConv(s, vbUnicode)
Label2 = "Скачано: " & Len(got)
If Len(got) = CLng(Size) Then
Open "c:\1.exe" For Output As #1
Print #1, got
Close #1
Exit Do
Else
DoEvents
End If
Loop


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

Спасибо!

Igor_123
Осторожный Баянист
Осторожный Баянист
Аватара пользователя
 
Сообщения: 1325
Зарегистрирован: 21.07.2004 (Ср) 13:00
Откуда: Днепропетровск

Сообщение Igor_123 » 08.04.2005 (Пт) 6:52

Ты файл пишешь как текстовый, возможно проблема в этом!
Попробуй
[codeOpen "TESTFILE" For Binary Access Write As #1
' Close before reopening in another mode.
Close #1[/code]

Преобразовывай строку в масив байт и записывай
Put #1,,Arr

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 08.04.2005 (Пт) 6:52

Я с Inet1 не работал, но все равно спрошу
А зачем ты StrConv(s, vbUnicode) делаеш?
الفيجوال بيسك الرابح

Stally
Начинающий
Начинающий
 
Сообщения: 14
Зарегистрирован: 19.12.2004 (Вс) 4:00

Сообщение Stally » 13.04.2005 (Ср) 3:34

Попробовал... Написал вот так:

Код: Выделить всё
Open "c:\1.exe" For Binary Access Write As #1
Put #1, , got
Close #1


А строку в массив преобразовывать чем? Split-ом?
Файл всё равно получается битый, он на несколько kb больше исходного, естественно, не запускается...

Stally
Начинающий
Начинающий
 
Сообщения: 14
Зарегистрирован: 19.12.2004 (Вс) 4:00

Сообщение Stally » 13.04.2005 (Ср) 6:40

Всё, разобрался! :) :)
Всё оказалось очень просто.
Спасибо всем большое! :D

Просто у меня руки кривые...
Теперь всё замечательно качается.

FaKk2
El rebelde gurú
El rebelde gurú
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 13.04.2005 (Ср) 7:01

Напиши решение. Чтоб в будущем сюда RTFM'ить :)
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 13.04.2005 (Ср) 7:04

Полагаю, Open ... As Binary?
Lasciate ogni speranza, voi ch'entrate.

Igor_123
Осторожный Баянист
Осторожный Баянист
Аватара пользователя
 
Сообщения: 1325
Зарегистрирован: 21.07.2004 (Ср) 13:00
Откуда: Днепропетровск

Сообщение Igor_123 » 13.04.2005 (Ср) 8:53

Ну как бы других вариантов нет(с fso можно было повозиться, но результат, мне кажеться был бы таким же)

Stally
Начинающий
Начинающий
 
Сообщения: 14
Зарегистрирован: 19.12.2004 (Вс) 4:00

Сообщение Stally » 13.04.2005 (Ср) 19:52

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


Код: Выделить всё
Dim byteTempArray() As Byte
Dim size As Long
Open "c:\1.exe" For Binary Access Write As #1
If State = 12 Then
    size = Inet1.GetHeader("Content-length")
    Label1 = "Всего: " & size
    DoEvents
    Do
        On Error GoTo away
        s = Inet1.GetChunk(1024, icByteArray)
        If Len(s) = 0 Then Exit Do
        byteTempArray = s
            got = got & StrConv(s, vbUnicode)
            Label2 = "Получено: " & Len(got)
                    Put #1, , byteTempArray
        DoEvents   
    Loop
Close #1
away:
End If

Stally
Начинающий
Начинающий
 
Сообщения: 14
Зарегистрирован: 19.12.2004 (Вс) 4:00

Сообщение Stally » 13.04.2005 (Ср) 19:59

Только опять проблема случилась...! ччёрт...
Когда пытаюсь закачать файл через сеть (выход в интернет через прокси-сервер), соответственно используя вот это всё:

Код: Выделить всё
Inet1.Protocol = icHTTP
    Inet1.AccessType = icNamedProxy
    Inet1.Proxy = pa 'в формате адрес:порт
    Inet1.URL = y 'переменная содержит в себе http ссылку
    Inet1.UserName = plog
    Inet1.Password = ppas


Прога вылетает на строчке:
If State = 12 Then
т.е. выходит на End If...

Что тут делать? Если честно, то я вообще не понимаю что значит строка If State = 12, но у других умных людей она работает, всавил у себя - тоже заработало. На Dial-Up-е... а вот на сети - не хочет...

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 13.04.2005 (Ср) 20:00

2 Stally

Ты, видать, Asper с VBLand? Ну и на каких форумах тебе повезло с ответом? :)

Stally
Начинающий
Начинающий
 
Сообщения: 14
Зарегистрирован: 19.12.2004 (Вс) 4:00

Сообщение Stally » 13.04.2005 (Ср) 20:16

BV
Когда-то не так давно не везло нигде... но vbStreets мне нравится больше всех, хотя VB-шных форумов не так уж и много. vbStreets Forever :)
На VbLand подтолкнули на путь истины, а здесь помог пример, изучив который, всё встало на свои места.

Stally
Начинающий
Начинающий
 
Сообщения: 14
Зарегистрирован: 19.12.2004 (Вс) 4:00

Сообщение Stally » 13.04.2005 (Ср) 20:28

Итак, к нашим баранам. Ура, победа.
Посмотрев на эту загадочную переменную State, оказалось, что при использовании в сети она чудесным образом принимает значение state=3
В итоге строка получилась такая:
Код: Выделить всё
If State = 12 Or State = 3 Then
    size = Inet1.GetHeader("Content-length")
    Label1 = "Всего: " & size...
...и далее по тексту


И ещё кой чего. Неожиданно прога заругалась на Dim size As Long. Кричит, что тип не соответствует. Пришлось сделать Dim size As String.

Что самое интересное, при запуске через дебаггер, по шагам, ошибки типа переменной не возникает. Когда работает готовый проект - ругается... И такое несоответствие на каждом шагу. В дебаггере всё как по маслу, а в итоге - всё мимо (или наоборот).

В общем всё выглядит так:
Код: Выделить всё
Private Sub Inet1_StateChanged(ByVal State As Integer)
Dim byteTempArray() As Byte
Dim size As String
Open "c:\1.exe" For Binary Access Write As #1
If State = 12 or State=3 Then
    size = Inet1.GetHeader("Content-length")
    Label1 = "Всего: " & size
    DoEvents
    Do
        On Error GoTo away
        s = Inet1.GetChunk(1024, icByteArray)
        If Len(s) = 0 Then Exit Do
        byteTempArray = s
        got = got & StrConv(s, vbUnicode)
        Label2 = "Получено: " & Len(got)
        Put #1, , byteTempArray
        DoEvents   
    Loop
Close #1
away:
End If
End Sub


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, SemrushBot, Yandex-бот и гости: 163

    TopList