2015-01-10 100 views
0

我想按順序讀取文件夾中的一些文本文件路徑。但是,我只獲得第一個文件。從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 
+0

這是不會做你的想法。它會在每個勾號上執行GetFiles。 – Plutonix

回答

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 
0

代碼加載的所有文件中的計時器事件,並將它們分配到內循環TextBox1.Text財產。每個循環都會覆蓋在前一個循環中寫入的數據。 在循環結束時,您只能看到最後一個值。

要按順序顯示Timer Tick事件內的文件,需要在全局FileInfo數組中啓動Timer之前讀取目錄內容。另一個全局變量將用作索引器在Timer.Tick事件中顯示此FileInfo數組中的特定文件。
該指數將增加,在接下來的刻度,可以顯示下一文件

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 

編輯
根據您的意見,您需要將文本框的MultiLine屬性設置爲true(使用窗體設計器),然後在每一個刻度,而不是替換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()) 
+0

感謝您的幫助,但它仍然給我在文本框中的1個文件。我想讓文本框能夠加載下一個文件路徑等等。謝謝 – user3115713

+0

然後,您需要將TextBox的MultiLine屬性設置爲true,而不是將當前文本替換爲當前文本。試圖修復答案 – Steve

+0

感謝您的更新。文本框的多行屬性一直處於激活狀態。執行這兩個代碼後仍然卡住一個路徑。我想知道所有的方法都會得到相同的結果,可能會丟失什麼。 – user3115713

0

在你發佈你在哪裏得到的所有文件中的for循環每次定時器觸發的原代碼。 在閱讀史蒂夫答案和你的評論之後,可能你總是得到所有的文件,但是你重寫了textbox.text的值。

TextBox1.Text + = <字符串> & vbNewLine

凡<字符串>,當然,是DirectoryInfo.GetFiles()

我想返回的字符串史蒂夫答案工作得很好,但是你沒有很好地實施。

+0

謝謝,我想獲取循環中每次發出的變量(路徑)並將其存儲在一個字符串中。我想在我的代碼中的其他地方使用這個字符串值。再次感謝 – user3115713

0

我會盡量讓你儘可能簡單。你微軟的這個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。

您甚至可以保留對.Subscribe(...)調用返回的IDisposable的引用,以便儘早終止observable(timer)。

簡單。

相關問題