VB.net用文本文件填充数据表
我正在为自己制作一个密码管理器,并将所有数据本地存储在一个文本文件中。目前我并不担心安全问题,只是想让它发挥作用 我可以很好地读取文本文件,并用逗号分割每个条目,但我不知道如何正确设置循环的VB.net用文本文件填充数据表,vb.net,datatable,text-files,Vb.net,Datatable,Text Files,我正在为自己制作一个密码管理器,并将所有数据本地存储在一个文本文件中。目前我并不担心安全问题,只是想让它发挥作用 我可以很好地读取文本文件,并用逗号分割每个条目,但我不知道如何正确设置循环的格式,以使它们按正确的顺序排列 下面是pass.txt中数据的外观 Gmail,07/31/2020,password, Facebook,07/31/2020,password, 我有3列,服务,上次更改,和密码。当前,“我的数据”从上到下填充第一列,直到数组的末尾splitData,然后对其余两列执行相
格式,以使它们按正确的顺序排列
下面是pass.txt中数据的外观
Gmail,07/31/2020,password,
Facebook,07/31/2020,password,
我有3列,服务
,上次更改
,和密码
。当前,“我的数据”从上到下填充第一列,直到数组的末尾splitData
,然后对其余两列执行相同的操作
我的想法是我需要一个嵌套的for循环
,但我仍然停留在逻辑上
Public Class Form2
Private thedatatable As New DataTable
Private workDirectory = My.Computer.FileSystem.CurrentDirectory
Private rw As System.IO.StreamReader
Private fileContents As String
Private splitData As String()
Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
With thedatatable
.Columns.Add("Service", System.Type.GetType("System.String"))
.Columns.Add("Last Changed", System.Type.GetType("System.String"))
.Columns.Add("Password", System.Type.GetType("System.String"))
End With
workDirectory += "\pass.txt"
rw = My.Computer.FileSystem.OpenTextFileReader(workDirectory)
fileContents = rw.ReadToEnd()
splitData = fileContents.Split(New Char() {","c}) REM reads pass.txt
REM to string array while splitting at commas
Dim word As String
For Each word In splitData REM iterates for each split word
Dim newrow As DataRow = thedatatable.NewRow
newrow("Service") = word
newrow("Last Changed") = word
newrow("Password") = word
thedatatable.Rows.Add(newrow)
Next
DataGridView1.DataSource = thedatatable
End Sub
End Class
使用ReadLines()
和String.Split()
由于您可能需要它,下面是一个示例,您可以按照它将数据存储为JSON
► 如果您没有使用.Net Core 3.0+(它提供了自己的功能-当您要使用.Net Core时,请立即切换到该功能),我建议您安装:
- 打开Visual Studio的NuGet软件包管理器(
工具->NuGet软件包管理器->管理解决方案的NuGet软件包
)
- 搜索
Newtownsoft.Json
。此时,第一个条目将是Newtownsoft.Json v.12.0.3
选择安装软件包,生成解决方案
现在,要序列化DataTable,需要一个命令:
Dim json as String = JsonConvert.SerializeObject([Your DataTable])
Dim dt = JsonConvert.DeserializeObject(Of DataTable)([JSON String])
要反序列化数据,将JSON转换为DataTable,请执行另一个命令:
Dim json as String = JsonConvert.SerializeObject([Your DataTable])
Dim dt = JsonConvert.DeserializeObject(Of DataTable)([JSON String])
- 这些在代码中通过两种方法实现:
SaveMyPasswords()
和LoadMyPasswords()
。您只需要指定存储JSON的路径
存储数据的路径是一个重要问题。您可以做出不同的选择:
- 通常使用用户
[User]\AppData\Local
文件夹。此位置由应用程序返回。LocalUserAppDataPath
[User]\AppData\Roaming
部分由应用程序返回。UserAppDataPath
\ProgramData
文件夹是一个不错的选择,此路径由应用程序返回。CommonAppDataPath
请注意,这些路径已包含以程序集命名的子文件夹(产品
或公司
+程序集名称+版本)。在这段代码中,我使用的是应用程序.CommonAppDataPath
。选择您认为适合您的场景的任何内容
- 我避免(尝试)将数据存储在可执行文件的路径中,您可能会发现您没有在那里写入数据的访问权限。当然,您可以提示用户提供存储路径(使用SaveFileDialog或FolderBrowserDialog)。这是另一种可能的选择
当您第一次运行应用程序时,此路径将不存在,但将在您将数据保存到此位置时立即创建此路径:,例如,如果文件尚不存在,则创建文件的完整路径
btnSaveData。单击处理程序调用SaveMyPasswords()
序列化并存储数据
假设您的数据表是在OP中构建的(但日期是DateTime对象):
为什么不改用JSON格式呢?因此,您可以在一个命令中反序列化/序列化所有DataTable内容。顺便说一句,避免这样:workDirectory=My.Computer.FileSystem.CurrentDirectory
和这样:workDirectory+=“\pass.txt”
。否则,迭代而不是这样做:My.Computer.FileSystem.OpenTextFileReader(…).ReadToEnd()
,因为我从未使用过JSON,也不知道它的用途。另外,为什么workDirectory+=
不好?我知道它很刺耳,但真的很糟糕@JimiThe“坏”部分是手动尝试将反斜杠合并到路径中,如果路径中已有反斜杠,则可能会出现多个反斜杠。您应该使用:Dim FileName作为String=System.IO.Path.Combine(workDirectory,“pass.txt”)
,然后它将为您处理这些反斜杠。有关更多信息,请参阅。另外,我不知道如何实现您的建议@Jimi。虽然闲置,但还是有意义的,谢谢。左右撞上了路障。我将为文本文件提供一些内容,感谢@JimiThank you的帮助,因为它提供了详细的格式回复。每当有人读到这条评论,就要更像这个家伙^。