Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Чтение файла из интернета, чтоб не мешало работе программы / 8 сообщений из 8, страница 1 из 1
24.01.2015, 13:52
    #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
24.01.2015, 14:19
    #38862291
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение файла из интернета, чтоб не мешало работе программы
DownloadDataAsync или DownloadFileAsync с соответвующими событиями
...
Рейтинг: 0 / 0
24.01.2015, 14:30
    #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
24.01.2015, 14:37
    #38862295
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение файла из интернета, чтоб не мешало работе программы
Кстати, в 8.1 "автономный режим IE" вообще отсутствует как таковой? (сейчас обратил внимание)
Обычно перед скачкой файла я его принудительно выключаю программно если включен (умею через API).
А на 8.1 я и в IE в Файл такого пункта не вижу, и через свою ф-цию выключить не могу.

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

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

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

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

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


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