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

时间:2015-01-10 22:28:17

标签: vb.net file timer directory

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

我需要获取第一个文件,执行计时器,获取下一个文件路径,执行计时器直到文件夹中的最后一个文件,然后停止。我怎么能绕过这个?

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

4 个答案:

答案 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(计时器)。

简单。