Как я могу прочитать файл из Интернета и выбрать пары строк для обработки? - PullRequest
0 голосов
/ 10 февраля 2020

Так что у меня есть странная ситуация, которую я предвосхищу, поскольку я новичок в этом, более «опытный» в VBS и перенес большую часть моих сценариев в PowerShell. Я пишу программу WinForms для чтения INI-файла, хранящегося в Интернете, чтобы я мог загрузить обновления, указанные в INI. В INI каждый загружаемый файл хранится в текстовом блоке (см. Ниже), и мне нужно go через каждый блок, найти строки «Source =» и «Destination =», загрузить файл из источника и поместить его в папке «Destination =». В WinForm пользователь должен выбрать место загрузки, поэтому мне нужно добавить «Destination =» к вводу пользователя.

Содержимое веб-файла INI:

[.Net4.6.1FrameworkFull]
DisplayName=.Net Framework 4.6.1 Full
Source=https://download.microsoft.com/download/E/4/1/E4173890-A24A-4936-9FC9-AF930FE3FA40/NDP461-KB3102436-x86-x64-AllOS-ENU.exe
Destination=Redist\Microsoft .net\4.6.1\Full\NDP461-KB3102436-x86-x64-AllOS-ENU.exe
Size=67681000

[.Net4.6.1FrameworkWeb]
DisplayName=.Net Framework 4.6.1 Web
Source=https://download.microsoft.com/download/3/5/9/35980F81-60F4-4DE3-88FC-8F962B97253B/NDP461-KB3102438-Web.exe
Destination=Redist\Microsoft .net\4.6.1\Web\NDP461-KB3102438-Web.exe
Size=1424328

Вот что До сих пор я читал INI-файл и выводил его на консоль:

Dim inStream As StreamReader
Dim webRequest As WebRequest
Dim webresponse As WebResponse
webRequest = WebRequest.Create(DlSrc.Text)
webresponse = webRequest.GetResponse()
inStream = New StreamReader(webresponse.GetResponseStream())
Console.WriteLine(inStream.ReadToEnd)

Я могу без проблем отправить вывод inStream на консоль, но не могу понять, как проверить каждый блок для строк источника / назначения, чтобы я мог затем загрузить и поместить их в нужные папки. Я попытался создать массив для строки, но он просто возвращается с ошибкой, говоря, что его невозможно преобразовать из строки в объект.

Как я уже говорил в начале этого поста, я ' Я действительно новичок в этом и понятия не имею, что я на самом деле делаю, что делает большую часть этого много CopyPasta от Google. Пожалуйста, сделайте мне одолжение и предоставьте ELI5 любую помощь, которую вы можете оказать, потому что я, вероятно, понятия не имею, о чем вы говорите.

1 Ответ

1 голос
/ 11 февраля 2020

Есть много способов сделать то, что вам нужно. Это всего лишь пример для начала. Он проведет вас через манипуляции со струнами. Обратитесь к классу String в. net. https://docs.microsoft.com/en-us/dotnet/api/system.string?view=netframework-4.8

Чтобы получить ввод местоположения, вы захотите использовать одну из сборок в диалоговых окнах. См. Панель инструментов в режиме конструктора.

Для работы с файлами см. Класс File в System.IO (требуется импорт в верхней части файла кода) https://docs.microsoft.com/en-us/dotnet/api/system.io.file?view=netframework-4.8

Объяснение этого кода.

A StreamReader предоставляет метод .Dipose, поэтому его следует закрыть и утилизировать, чтобы освободить неуправляемые ресурсы. Блок Using...End Using позаботится об этом за вас, даже если возникнет ошибка.

У меня было StreamReader, предоставляющее данные по строкам, которые я добавил в список. Список передается методу, который анализирует каждую строку. Я создал класс для хранения данных. Когда источник и назначение найдены, свойства класса устанавливаются в конструкторе класса, и объект добавляется в список SrcDest. Этот список является переменной уровня формы, поэтому вы можете использовать объекты в нем в любом месте формы.

Private Sub OPCode()
    Dim lines As New List(Of String)
    Using inStream = New StreamReader(WebResponse.GetResponseStream())
        Dim line As String
        Do
            line = inStream.ReadLine()
            lines.Add(line)
        Loop Until line Is Nothing
    End Using
    FillSourceDestinationList(lines)
End Sub

Public Class SourceDestination
    Public Property Source As String
    Public Property Destination As String

    Public Sub New(s As String, d As String)
        Source = s
        Destination = d
    End Sub
End Class

Private SrcDes As New List(Of SourceDestination)

Private Sub FillSourceDestinationList(sourceDoc As List(Of String))

    Dim sou As String = ""
    Dim des As String = ""
    For Each line In sourceDoc
        If line.StartsWith("Source=") Then
            Dim splitString = line.Split("="c)
            sou = splitString(1)
        End If
        If line.StartsWith("Destination") Then
            Dim splitString = line.Split("="c)
            des = splitString(1)
        End If
        If sou <> "" AndAlso des <> "" Then
            Dim sd As New SourceDestination(sou, des)
            SrcDes.Add(sd)
            sou = ""
            des = ""
        End If
    Next
End Sub

Private Sub UseSourceDestinationList()
    For Each item In SrcDes
        Dim source = item.Source
        Dim destination = item.Destination
        'Use these as needed
    Next
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...