/ / VB.NET Program zawsze czyta ostatnio utworzony plik tekstowy - vb.net, Visual Studio

Program VB.NET zawsze czyta ostatnio utworzony plik tekstowy - vb.net, visual-studio

Próbuję stworzyć formularz logowania,

Moje kodowanie jest obecnie:

Imports System
Imports System.IO

Public Class frmLogin

Dim username As String
Dim password As String
Dim fileReader As String
Dim folderpath As String
Dim files As Integer
Dim filepath As String

Public Structure info
Dim U As String
Dim P As String
End Structure

Dim details As info

Private Sub btnlogin_Click(sender As Object, e As EventArgs) Handles btnlogin.Click

If txtusername.Text = details.U And txtpassword.Text = details.P Then
MessageBox.Show("Correct!")
frmmenu.Show()
Me.Hide()
Else
MessageBox.Show("wrong")
txtusername.Clear()
txtpassword.Clear()
End If

End Sub

Private Sub btncreate_Click(sender As Object, e As EventArgs) Handles btncreate.Click
frmcreate.Show()
End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click


files = files + 1
filepath = "C:UsersTheGloveDesktopAlex"s Programloginfile" & files & ".txt"
Dim di As DirectoryInfo = New DirectoryInfo("C:UsersTheGloveDesktopAlex"s Program")
folderpath = "C:UsersTheGloveDesktopAlex"s Program"
files = System.IO.Directory.GetFiles(folderpath, "*.txt").Count

For Each fi In di.GetFiles()

MsgBox(fi.Name)
Dim FILE = System.IO.File.ReadAllLines("C:UsersTheGloveDesktopAlex"s Programloginfile" & files & ".txt")
Dim myArray As String() = FILE
details.U = myArray(0)
details.P = myArray(1)

Next
End Sub


End Class

Przycisk 1 zostanie połączony z btnlogin, gdy otrzymamdziała i obecnie jest to tylko oddzielny przycisk do odczytu każdego pliku tekstowego. Po naciśnięciu każdego przycisku (Przycisk 1 -> btnlogin) tylko ostatnio utworzony plik tekstowy jest poprawny.

Odpowiedzi:

0 dla odpowiedzi № 1

Wygląda na to, że twój kod czyta wszystkie pliki tekstowe, ale ciągle je nadpisuje details.u i details.p z wartością pobraną z każdego pliku. Tak więc, gdy pętla dotrze do ostatniego pliku, te wartości są tym, co kończy się w details obiekt.

Zakładam, że chcesz przeczytać wszystkienazwy użytkowników i hasła do listy i sprawdź szczegóły w TextBoxach z tą listą, więc .. Twój kod powinien prawdopodobnie wyglądać podobnie do poniższego (zobacz komentarze do kodu, aby uzyskać wyjaśnienie niektórych różnic.

Zanim przejdziemy do kodu, możemy podać kilka wskazówek.

Po pierwsze, zawsze staraj się używać nazw, które mają znaczenie. Definiowanie swojej struktury jako Info nie jest tak znaczące, jak mogłoby być. Na przykład lepiej byłoby to nazwać UserInfo i zamiast używać P i U, lepiej by było, gdybyś używał Password i UserName. Może to nie ma teraz większego znaczenia, ale kiedy zaczniesz pisać większe, bardziej złożone programy i będziesz musiał do nich wrócić za 6 miesięcy, aby je zaktualizować, info.P lub details.P nie są tak pouczające, jak sugerowane nazwy.

Po drugie, jak wspomniał @ajd.Nie używaj magicznych ciągów. Utwórz jedną definicję na początku swojego kodu, która może być używana w całym kodzie. Ponownie, znacznie ułatwia to konserwację, jeśli wystarczy zmienić ciąg znaków tylko raz, a nie wiele razy, i zmniejsza ryzyko błędów.

Na koniec kilka zmiennych, które maszzdefiniowane nie są w ogóle używane w twoim kodzie. Ponownie, na tym poziomie nie jest to poważny problem, ale przy dużych programach możesz skończyć z większym zużyciem pamięci niż chcesz.

Dim username As String
Dim password As String
Dim fileReader As String
Dim folderpath As String = "C:UsersTheGloveDesktopAlex"s Program"
Dim files As Integer
Dim filepath As String

Public Structure UserInfo
Dim Name As String
Dim Password As String
End Structure

"Change details to a list of info instead of a single instance
Dim userList As New List(Of UserInfo)


Private Sub Btnlogin_Click(sender As Object, e As EventArgs) Handles btnlogin.Click
"Iterate through the list of details, checking each instance against the textboxes
For Each tempUserInfo As UserInfo In userList
If txtusername.Text = tempUserInfo.Name And txtpassword.Text = tempUserInfo.Password Then
MessageBox.Show("Correct!")
frmmenu.Show()
Me.Hide()
"This is here, because after your form has opened an closed, the loop
"that checks usernames and passwords will continue. The line below exits the loop safely
Exit For
Else
MessageBox.Show("wrong")
txtusername.Clear()
txtpassword.Clear()
End If
Next
End Sub

Private Sub Btncreate_Click(sender As Object, e As EventArgs) Handles btncreate.Click
frmcreate.Show()
End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
"clear the list of user details otherwise, if the files are loaded a second time,
"you"ll get the same details added again
userList.Clear()
"This line replaces several lines in your code that searches the folder for files
"marching the search pattern
Dim fileList() As FileInfo = New DirectoryInfo(folderpath).GetFiles("loginfile*.txt")
For Each fi As FileInfo In fileList
MsgBox(fi.Name)
Dim userDetails() As String = System.IO.File.ReadAllLines(fi.FullName)
Dim tempInfo As New UserInfo With {.Name = userDetails(0), .Password = userDetails(1)}
"An expanded version of the above line is
"Dim tempInfo As New info
"tempInfo.U = userDetails(0)
"tempInfo.P = userDetails(1)
userList.Add(tempInfo)
Next
files = fileList.Count
End Sub