我正在尝试按顺序读取文件夹中的某些文本文件路径。但是,我只得到第一个文件。
我需要获取第一个文件,执行计时器,获取下一个文件路径,执行计时器直到文件夹中的最后一个文件,然后停止。我怎么能绕过这个?
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
答案 0 :(得分:0)
这似乎有点Rube Goldberg-ish。只需获取所有文件并在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
答案 1 :(得分:0)
您的代码加载Timer事件中的所有文件,并将它们分配给循环内的TextBox1.Text属性。每个循环都会覆盖在前一个循环中写入的数据。 在循环结束时,您只能看到最后一个值。
要按顺序显示Timer Tick事件中的文件,您需要在全局FileInfo数组中启动Timer之前读取目录内容。另一个全局变量将用作索引器,以在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())
答案 2 :(得分:0)
在原始代码中,您发布了每次定时器单击时获取for循环中所有文件的位置。 在阅读了史蒂夫的答案和你的评论之后,可能你总是得到所有文件,但是你覆盖了textbox.text值。
TextBox1.Text + = <字符串> &安培; vbNewLine
其中< String>当然是DirectoryInfo.GetFiles()
返回的字符串我认为史蒂夫的回答很好,但你没有很好地实现它。
答案 3 :(得分:0)
我会尝试为您提供尽可能简单的方法。您是Microsoft的Reactive Framework。只是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。
您甚至可以保留对IDisposable
调用返回的.Subscribe(...)
的引用,以提前终止observable(计时器)。
简单。