2011-07-29 13 views
2

何らかの理由で、外側のブロックが再帰的に更新されていないと思われます。ループで"C:\Users\Drise"内のすべてのディレクトリを配列internaldirs()に追加します。これを行う正しい方法についてのアドバイスは、私はそれを不適切にやっているようだ?再帰的For Eachループdoesntが適切に再帰するようです。

Static internaldirs() As String 

internaldirs.add("C:\Users\Drise") 

For Each internaldir As String In internaldirs 
    For Each direc As String In Directory.GetDirectories(internaldir) 
     internaldirs.Add(direc) 
    Next 
Next 

ソリューション:

Sub recursivedirs() 
    Static internaldirs As New List(Of String) 
    Try 
     If internaldirs(0) = "C:\Users\Drise" Then 
      Call AddDirToList(internaldirs, internaldirs(0)) 
     End If 
    Catch 
     internaldirs.Add("C:\Users\Drise") 
     Call AddDirToList(internaldirs, internaldirs(0)) 
    End Try 

End Sub 

Private Sub AddDirToList(ByRef dirs As List(Of String), ByVal currentDir As String) 
    dirs.Add(currentDir) 
    Try 
     For Each subDir As String In Directory.GetDirectories(currentDir) 
      AddDirToList(dirs, subDir) 
     Next 
    Catch 
    End Try 
+0

'List(Of String)'を使用する必要があります。 – SLaks

答えて

0

Andrew Cooperが述べたように、For Eachループで使用されているコレクションは変更できません。

インデックスカウンタで行うことができます。

Dim internaldir As List(Of String) 
internaldir.Add("C:\Users\Drise") 
Dim i As Integer = 0 
Do Until i >= internaldir.Count 
    Dim internaldir As String = internaldirs(i) 
    For Each currentdir As String In Directory.GetDirectories(internaldir) 
     internaldirs.Add(currentdir) 
    Next 
    i += 1 
Loop 
' If you want an array as output, use: 
Dim array As String() = internaldirs.ToArray() 
2

短い答えは:あなたが反復処理しているコレクション(internaldirs)を変更することはできません。

長い答え:ディレクトリツリーのフォルダを列挙する文字列配列を作成しようとしているようです。 Listと再帰関数を使うのが良い方法です。

Static dirs As List(Of String) 

dirs = New List(Of String) 
AddDirToList(dirs, "C:\Users\Drise") 


Private Sub AddDirToList (dirs as List(Of String), currentDir as String) 
    dirs.Add(currentDir) 
    For Each subDir As String In Directory.GetDirectories(currentDir) 
     AddDirToList(dirs, currentDir) 
    Next 
End Sub 

構文上の問題はご容赦ください。私はC#の人です。

+0

私はその気持ちを持っていました。長い答えと、可能な解決策? – Drise

+0

私はそれを試してみましょう、ありがとう。 – Drise

+0

@Andrew、あなたの構文を修正しました。関数の括弧が欠けていただけです。 –