VB ListBox выводит список ftp-каталогов и удаляет несколько строк на основе номера в имени папки - PullRequest
0 голосов
/ 10 апреля 2020

Мне очень помогает этот сайт в поисках решения, но в этот момент я полностью застрял. Я не программист, все же смог достичь этого.
Идея моего маленького проекта - загрузить последнюю версию программы (папки) с FTP-сервера. Распакуйте файлы и обновите текущую папку программы новыми файлами. Но перед этим сделайте резервную копию выходящей папки программы на другой адрес FTP.

То, с чем я борюсь, - это способ публикации версий программ (папок) на FTP: структура папок на FTP
Я не могу предсказать, какая будет следующая папка чтобы загрузить, потому что, например, для версии программы:
7.6.16
это может быть:
WERSJA_NOWY_TEMPLATE_7.6.17
или
WERSJA_NOWY_TEMPLATE_7.7.01
все, что будет выпущено.

На диске C находится INI-файл, содержащий текущую версию программы. Я смог получить эту информацию, прочитав строку, удалив ненужные символы и разделив строку:

Dim wersja1 As String = File.ReadAllLines("C:\Windows\file.ini").FirstOrDefault(Function(x) x.Contains("WERSJA="))
Dim characterToRemove1 As String = "WERSJA="
Dim wersja2 As String = Replace(wersja1, characterToRemove1, "")
Dim characterToRemove2 As String = "T"
Dim wersja3 As String = Replace(wersja2, characterToRemove2, "")
Dim wersja4 As String() = wersja3.Split(New Char() {"."c})
Dim w1 As String = wersja4(0)
Dim w2 As String = wersja4(1)
Dim w3 As String = wersja4(2)

например, из строки:
WERSJA=7.6.5T
Я получил:
w1 = 7 w2 = 6 w3 = 5
Затем я заменяю последний (w3) на двухзначный номер ( из-за способа именования папок на FTP ):

If w3 < 10 Then
    w3 = "0" & w3
Else
    w3 = w3
End If

Так что если:
w3 = 5 >> I get 05 w3 = 16 >> I get 16

Пока все хорошо.

На следующем шаге я хотел бы увидеть отфильтрованный список версий программ (папок) в ListBox или 2 ListBoxes. Я хотел бы отфильтровать список, чтобы видеть только папку с номером, превышающим текущую версию программы, поэтому я могу выбрать правильную для загрузки.

Почему так? Потому что, если текущая версия, например,
7.6.16
и есть 3 новых, например:
7.6.17 7.6.18 7.7.01
Мне нужно загрузить все из них по одному, обновите запрограммируйте файлы и запустите программу для обновления базы данных sql в порядке их выпуска. Я не могу пропустить ни одну версию при обновлении.

Dim FTPurl As String = "ftp://xx.xx.xxx.xxx/wersje/"
Dim FTPwersja As String = "WERSJA_NOWY_TEMPLATE_*"
Dim FTPlog As String = "xxx"
Dim FTPpass As String = "yyy"

Dim clsRequest As FtpWebRequest = System.Net.WebRequest.Create(FTPurl & FTPwersja)
clsRequest.Credentials = New System.Net.NetworkCredential(FTPlog, FTPpass)
clsRequest.Method = System.Net.WebRequestMethods.Ftp.ListDirectory
Dim listResponse As FtpWebResponse = clsRequest.GetResponse
Dim reader As StreamReader = New StreamReader(listResponse.GetResponseStream())

'folder list
While reader.Peek >= 0
    ListBox1.Items.Add(reader.ReadLine)
End While

'remove empty lines
For i As Integer = ListBox1.Items.Count - 1 To 0 Step -1
    If ListBox1.GetItemText(ListBox1.Items(i)) = String.Empty Then
        ListBox1.Items.RemoveAt(i)
    End If
Next i

Приведенный выше код дает мне этот результат.
Я нашел этот код, который позволяет фильтровать ListBox, но я не имею ни малейшего понятия о том, как преобразовать его в l oop, поэтому я буду видеть только папки с большими числами, чем текущая версия программы:

'filter result in list box
Dim items = From it In ListBox1.Items.Cast(Of Object)()
    Where it.ToString().IndexOf("7.5", StringComparison.CurrentCultureIgnoreCase) >= 0
Dim matchingItemList As List(Of Object) = items.ToList()
ListBox1.BeginUpdate()
'ListBox1.Items.Clear() 'add to list
For Each item In matchingItemList
    ListBox1.Items.Remove(item) 'remove from list
    'ListBox1.Items.Add(item) 'add to list
Next
ListBox1.EndUpdate()

У меня также есть этот код, чтобы поймать выбор и предотвратить cra sh при нажатии на пустую строку:

Private Sub ListBox1_SelectedIndexChanged(sender As Object, e As EventArgs) _
Handles ListBox1.SelectedIndexChanged
Try
    Dim LB1choice = ListBox1.SelectedItem.ToString()
    Label5.Text = LB1choice
Catch ex As Exception
    ListBox1.SelectedIndex = 0
End Try
End Sub

В идеале 2 ComboBox, где 1-й будет отображаться, например,
WERSJA_NOWY_TEMPLATE_7.6 WERSJA_NOWY_TEMPLATE_7.7
и в зависимости от выбора 2nd ComboBox будет перечислять новые подпапки в нем, например,
WERSJA_NOWY_TEMPLATE_7.6.16 WERSJA_NOWY_TEMPLATE_7.6.17
для 1-го и:
WERSJA_NOWY_TEMPLATE_7.7.01
для 2-го.
Я очень признателен, если кто-нибудь может мне помочь, потому что это выходит за рамки моих навыков.

...