>我正在尝试按顺序读取文件夹中的某些文本文件路径。但是,我只得到第一个文件。
我需要获取第一个文件,执行计时器,获取下一个文件路径,执行计时器直到文件夹中的最后一个文件,然后停止。我该如何解决这个问题?
Private zMailbox As String = "c:Fold"
Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) _
Handles Button1.Click
Timer1.Start()
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles Timer1.Tick
Dim finfo As New IO.DirectoryInfo(zMailbox)
For Each fi In finfo.GetFiles("*.txt")
TextBox1.Text = fi.FullName
Next
End Sub
感谢下面的贡献,我得到了使用文本框值的代码。但是,它给出了索引计数而不是我要检索的路径。
Private zMailbox As String = "c:Fold"
Dim files As FileInfo()
Dim index As Integer = 0
Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) _
Handles Button1.Click
Dim finfo As New IO.DirectoryInfo(zMailbox)
files = finfo.GetFiles("*.txt")
Timer1.Start()
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles Timer1.Tick
If index >= files.Length Then
index = 0
End If
TextBox1.Text = (ListBox1.Items.Add(files(index)))
index += 1
End Sub
代码加载 Timer 事件中的所有文件,并将它们分配给循环中的 TextBox1.Text 属性。每个循环都会覆盖在上一个循环中写入的数据。在循环结束时,您只能看到最后一个值。
若要按顺序显示计时器时钟周期事件中的文件,需要在全局 FileInfo 数组中启动计时器之前读取目录内容。另一个全局变量将用作索引器,以在 Timer.Tick 事件中显示此 FileInfo 数组中的特定文件。
索引将递增,在下一个 Tick 时,您可以显示下一个文件
Dim files as FileInfo()
Dim index As Integer = 0
Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
Dim finfo As New IO.DirectoryInfo(zMailbox)
files = finfo.GetFiles("*.txt")
Timer1.Start()
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
if index >= files.Length Then
index = 0
End If
TextBox1.Text = files(index)
index += 1
End Sub
编辑
根据您的注释,您需要将 TextBox 的 MultiLine
属性设置为 true(使用表单设计器),然后在每次 Tick 时,而不是替换 Text 属性,而是附加到它
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
if index >= files.Length Then
return ' Reached the end of the array. Stop the Timer???
End If
TextBox1.AppendText(files(index) & Environment.NewLine)
index += 1
End Sub
作为旁注,如果您想一起显示所有文件名,那么根本不清楚为什么需要计时器。
你可以用这样的代码得到相同的结果
Dim finfo As New IO.DirectoryInfo(zMailbox)
Dim files = finfo.EnumerateFiles("*.txt")
TextBox1.Text = string.Join(Environment.NewLine, files.Select(Function(x) x.FullName).ToArray())
在您发布的原始代码上,每次计时器单击时,您都会在 for 循环中获取所有文件。在阅读了史蒂夫的回答和你的评论之后,可能你总是得到所有文件,但你覆盖了textbox.text值。
TextBox1.Text +=
& vbNewLine
当然,<字符串>是 DirectoryInfo.GetFiles() 返回的字符串。字符串>
我认为史蒂夫回答工作得很好,但你没有很好地实现它。
我会尽量让你觉得这很容易。为此,您Microsoft响应式框架。只是NuGet "Rx-main"。
然后,您可以执行以下操作:
finfo.GetFiles("*.txt").ToObservable() _
.Zip(Observable.Interval(TimeSpan.FromSeconds(1.0)), Function(f, _) f.Name) _
.ObserveOn(TextBox1) _
.Subscribe(Function(n) textbox_text += n + Environment.NewLine)
就是这样。没有计时器。没有单独的方法。不需要模块级变量。只需一行代码,您就完成了。
它在后台线程上处理,然后通过.ObserveOn(TextBox1)
调用封送回 UI。
您甚至可以保留对.Subscribe(...)
调用返回的IDisposable
的引用,以提前终止可观察量(计时器)。
简单。
似乎有点像鲁布·戈德堡。只需获取所有文件并在Button_Click
方法中循环遍历它们:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim finfo As New IO.DirectoryInfo(zMailbox)
For Each fi In finfo.GetFiles("*.txt")
TextBox1.Text = fi.FullName
Next
End Sub