powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Чтение файла из интернета, чтоб не мешало работе программы
8 сообщений из 8, страница 1 из 1
Чтение файла из интернета, чтоб не мешало работе программы
    #38862286
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Процедура такая
Т.е. прога при старте дает команду прочесть некий файл по заданному адресу.
Далее прога занимается своими делами (т.е. пользователь может нажимать кнопки, нормально работать и т.д.)
Как только файл скачан (или не скачан), то
1) если удачно скачан, то анализируется и делаются "действия".
2) в случае ошибки (нет коннекта к интернету, недоступен сервер) - не делать ничего.

Здесь тонкий момент:
При хорошем коннекте к инету процедура "мгновенная".
При плохом коннекте результата (или ошибки) можно ждать долго, например секунд 10-15.
Т.е. процедура скачки файла должна "стукануть" в программу, а не завешивать ее.

В VB6 я довольно долго искал способ и остановился на этом
(Microsoft Internet Transfer Control)
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
Private Sub CommandDownload_Click()
  Inet1.Execute "http://www.myserver.com/myfile.txt", "GET"
End Sub

Private Sub Inet1_StateChanged(ByVal State As Integer)
  Dim var_data As Variant
  Dim str_data As String
  If State = icResponseCompleted Then
    ' Get the first chunk.
    var_data = Inet1.GetChunk(1024, icString)
    str_data = str_data & var_data

    ' Get the rest of the chunks.
    Do
      DoEvents
      var_data = Inet1.GetChunk(1024, icString)
      If Len(var_data) = 0 Then Exit Do
      str_data = str_data & var_data
    Loop
    TextFile.Text = str_data 'здесь "стучим" назад в прогу
    'MsgBox str_data
  ElseIf State = icError Then
    TextFile.Text = "" 'здесь "стучим" назад в прогу
    MsgBox "error"
  End If
End Sub



Мне нужен аналог для .Net.

Нарыл пока такой вариант:
Код: vbnet
1.
2.
3.
4.
5.
6.
  Private Sub ButtonDownload_Click(sender As Object, e As EventArgs) Handles ButtonDownload.Click
    Dim wbClient As New Net.WebClient
    Dim strData As IO.Stream = wbClient.OpenRead("http://www.myserver.com/myfile.txt")
    Dim sr As IO.StreamReader = New IO.StreamReader(strData)
    TextBox1.Text = sr.ReadToEnd()
  End Sub


Но чувствую что он не отвечает "тонким требованиям" (насчет случая 10-15 секундного ожидания).

Подскажете как лучше это реализовать?
...
Рейтинг: 0 / 0
Чтение файла из интернета, чтоб не мешало работе программы
    #38862291
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DownloadDataAsync или DownloadFileAsync с соответвующими событиями
...
Рейтинг: 0 / 0
Чтение файла из интернета, чтоб не мешало работе программы
    #38862292
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,

спасибо, все, разобрался. В моем случае Download String Async думаю достаточно.
Текст файла английский, проблем с кодировками не вижу, но на всякий случай подсунул Default ANSI

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
  Private Sub ButtonDownloadAsync_Click(sender As Object, e As EventArgs) Handles ButtonDownloadAsync.Click
    Dim wc As New WebClient
    AddHandler wc.DownloadStringCompleted, AddressOf AlertStringDownloaded
    wc.Encoding = System.Text.Encoding.Default 'ANSI
    wc.DownloadStringAsync(New Uri("http://www.myserver.com/myfile.txt"))
  End Sub

  Private Sub AlertStringDownloaded(ByVal sender As Object, ByVal e As DownloadStringCompletedEventArgs)
    '  If the string request went as planned and wasn't cancelled:
    If e.Cancelled = False AndAlso e.Error Is Nothing Then
      TextBox1.Text = e.Result.ToString
    Else
      'MsgBox(e.Error.Message)
    End If
  End Sub
...
Рейтинг: 0 / 0
Чтение файла из интернета, чтоб не мешало работе программы
    #38862295
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, в 8.1 "автономный режим IE" вообще отсутствует как таковой? (сейчас обратил внимание)
Обычно перед скачкой файла я его принудительно выключаю программно если включен (умею через API).
А на 8.1 я и в IE в Файл такого пункта не вижу, и через свою ф-цию выключить не могу.

Ну и сюда вопрос (видимо касается только старых OS):
Через .Net кухню "автономный режим" проверить/вырубить можно? Или только WinInet-API?
...
Рейтинг: 0 / 0
Чтение файла из интернета, чтоб не мешало работе программы
    #38862299
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

в броузер то причём здесь?
WebClient через wininet api работает
...
Рейтинг: 0 / 0
Чтение файла из интернета, чтоб не мешало работе программы
    #38862310
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,

>WebClient через wininet api работает
Надо думать.

>в броузер то причём здесь?
А при том что если в браузере стоит галка "Автономный режим", то wininet api (и надо думать WebClient) файл не скачают.
На Win 8.1 пункт "Автономный режим" отсутствует.

Через API я включал/выключал автономный режим так (на .Net не переводил):
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
' Force the OffLine or OnLine mode

Public Sub SetOffLineMode(ByVal offLineMode As Boolean)
  Dim ci As INTERNET_CONNECTED_INFO
  Dim retValue As Boolean

  If offLineMode Then
    ci.dwConnectedState = INTERNET_STATE_DISCONNECTED_BY_USER
    ci.dwFlags = ISO_FORCE_DISCONNECTED
  Else
    ci.dwConnectedState = INTERNET_STATE_CONNECTED
  End If
  retValue = InternetSetOption(0&, INTERNET_OPTION_CONNECTED_STATE, ci, _
   LenB(ci))
End Sub



Проверял так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
Public Function get_Offline() As Boolean ' (VARIANT_BOOL * bOffline)
  Dim hr As Long
  Dim ci As INTERNET_CONNECTED_INFO
  Dim ci_len As Long
  ci_len = 8

  InternetQueryOption 0, INTERNET_OPTION_CONNECTED_STATE, ci, ci_len
  get_Offline = Not ((ci.dwConnectedState And INTERNET_STATE_CONNECTED) = INTERNET_STATE_CONNECTED)
End Function



На Win 8.1 SetOffLineMode(True) не работает, т.е. get_Offline всегда возвращает false.
Нету т.е. на 8-ке этого "автономного режима".

Но тем не менее, если WebClient через wininet api работает , есть аналог приведенным моим 2-м ф-циям?
Потому что для XP (на висте и 7-ке пока не глядел) они таки нужны.
...
Рейтинг: 0 / 0
Чтение файла из интернета, чтоб не мешало работе программы
    #38862316
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77>в броузер то причём здесь?
А при том что если в браузере стоит галка "Автономный режим", то wininet api (и надо думать WebClient) файл не скачают.

Странно. Проверил на XP. WebClient качает и при "автономном".
Ну тогда про "автономный режим" это вообще лишнее.

Гы... а вот Microsoft Internet Transfer Control (пример из VB6 в первом посте) при "автономном" не качает. Хотя по идее он обертка над тем же самым.
...
Рейтинг: 0 / 0
Чтение файла из интернета, чтоб не мешало работе программы
    #38862342
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Microsoft Internet Transfer Control (пример из VB6 в первом посте) при "автономном" не качает

Тоже самое было помню с Microsoft.XMLHTTPRequest. Долго думал, а чего он не хочет работать-то...
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Чтение файла из интернета, чтоб не мешало работе программы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]