从 VB.NET 中的文件夹中一次获取一个文件



>我正在尝试按顺序读取文件夹中的某些文本文件路径。但是,我只得到第一个文件。

我需要获取第一个文件,执行

计时器,获取下一个文件路径,执行计时器直到文件夹中的最后一个文件,然后停止。我该如何解决这个问题?

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

最新更新