2015-07-22 68 views
0

我有以下代碼嘗試獲取我的父目錄及其所有子目錄中的所有文件名。列出所有子導向器中的所有文件,無論有多少

該代碼有效,但不是我想要的。即它將處理父目錄中的所有文件,並且全部處於子目錄的「第一級」中,但我希望能夠進入所有級別的子目錄。

我該怎麼做?

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    'ListBox1.Items.AddRange(IO.Directory.GetFiles("C:\")) 

    For Each Dir As String In IO.Directory.GetDirectories("C:\Program Files") 
     ' ListBox1.Items.Add(Dir) 
     ListBox1.Items.AddRange(IO.Directory.GetFiles(Dir)) 
    Next 
End Sub 
+0

如果你想使用這樣的代碼,那麼你需要編寫一個遞歸方法。如果您搜索的文件夾不包含任何不可訪問的子文件夾,只需使用「Directory.GetFiles」的重載,即可以指定搜索子文件夾。這是一行代碼。 – jmcilhinney

+1

@jmcilhinney實際上你不需要遞歸方法...我也這麼認爲,但是我做了一些研究,發現下面的解決方案只需2行代碼即可實現。 –

+0

您通常會將該目錄添加到您的參數列表中,但.NET有一個內置方法,您可以通過鏈接來枚舉所有子目錄。 – ragerory

回答

0

下面是代碼已經做了你在短短的兩行想要的東西:

Dim result As List(Of String) = System.IO.Directory.GetFiles("C:\Program Files", "*", System.IO.SearchOption.AllDirectories) 
    listBox1.DataSource = result 

[信用做@Carsten在this post,其中列出的子目錄和我改上市文件,並將其綁定到ListBox元素。我不知道遞歸解決方案已經在System.IO中實現]

編輯1:採取評論的建議。

編輯2: GetFiles不允許針對此問題的解決方法:嘗試讀取時可以配置,以便當前用戶可能無法訪問它們。更多細節(和遞歸函數的解決方案)here

+1

該解決方案有兩個問題。首先,你爲什麼要調用'EnumerateFiles',然後調用'ToList'的結果? 「EnumerateFiles」的重點在於它返回一個可枚舉的列表,以便在檢索它們時通過使用這些項來保持資源利用率較低。通過調用'ToList'你可以撤消它,所以你爲什麼不直接調用'GetFiles',而是首先返回一個數組呢? – jmcilhinney

+0

好點,謝謝。我要編輯它。第二個問題是什麼? –

+1

第二個問題是,就像'GetFiles'一樣,如果遇到無法訪問的文件夾,'EnumerateFiles'將失敗並出現異常。如果您的根文件夾不包含無法訪問的子文件夾,但這不是問題,但如果您要將C:驅動器根文件夾指定爲起點,那麼您將被擰緊。在這種情況下,您需要使用遞歸方法,因爲您可以單獨處理每個子文件夾,忽略不可訪問的子文件夾並繼續。 – jmcilhinney

相關問題