VB.NET程序总是读取最后创建的文本文件

时间:2018-01-30 03:56:12

标签: vb.net visual-studio

尝试创建登录表单

目前我的编码是:

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:\Users\TheGlove\Desktop\Alex's Program\loginfile" & files & ".txt"
        Dim di As DirectoryInfo = New DirectoryInfo("C:\Users\TheGlove\Desktop\Alex's Program")
        folderpath = "C:\Users\TheGlove\Desktop\Alex'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:\Users\TheGlove\Desktop\Alex's Program\loginfile" & files & ".txt")
            Dim myArray As String() = FILE
            details.U = myArray(0)
            details.P = myArray(1)

        Next
    End Sub


End Class

当我使用它时,按钮1将与btnlogin合并,而现在只是一个单独的按钮来读取每个文本文件。 按下每个按钮(按钮1 - > btnlogin)时,只有最后创建的文本文件是正确的。

1 个答案:

答案 0 :(得分:0)

从外观上看,您的代码会读取所有文本文件,但会使用从每个文件中检索到的值覆盖details.udetails.p。因此,当循环到达最后一个文件时,这些值最终会出现在details对象中。

我假设您要将所有用户名和密码读入列表,并根据该列表检查TextBoxes中的详细信息,所以..您的代码应该类似于下面的代码(请参阅代码评论对一些差异的解释。

在我们开始编写代码之前,可以给你几点建议。

首先,始终尝试使用有意义的名称。将结构定义为Info并不是那么有意义。例如,您最好将其称为UserInfo,而不是使用PU,最好使用PasswordUserName。现在可能并不重要,但是当你开始编写更大更复杂的程序,并且必须在6个月内回到它们更新它们时,info.Pdetails.P不是与建议的名称一样有用。

其次,正如@ajd所说。不要使用魔法字符串。在代码的开头创建一个可以在整个过程中使用的定义。如果您只需要更换一次字符串而不是多次,这样可以使维护变得更加容易,并减少出错的可能性。

最后,您定义的几个变量根本不会在您的代码中使用。同样,在这个级别上,它不是一个主要问题,但是对于大型程序,最终可能会出现比您想要的更大的内存占用。

Dim username As String
Dim password As String
Dim fileReader As String
Dim folderpath As String = "C:\Users\TheGlove\Desktop\Alex'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