2017-10-31 5 views
-1

私は読み込みたいファイルの構造をTreeViewに表示します。フォルダとファイルは、C#Visual Studio環境のオブジェクトです。動的にオブジェクト/フォルダ構造を列挙します。C#

フォルダオブジェクトが含まれています:フォルダ

構造の最上位レベルのファイルの

  • コレクション
  • コレクションフォルダです。ここでは、このトップレベルのすべてのファイルを読み込むためにforeachループを使用して読み込みを開始します。次に、フォルダのコレクションを読み込んで、一番上のフォルダに他のフォルダが含まれているかどうかを確認する必要があります。そして、すべてのフォルダに対して同じ処理を繰り返す必要があります。

    構造の最上位から始め、そのフォルダにフォルダが含まれているかどうかを確認できますが、問題は構造がどのくらいの層に存在するかわからないことです。フォルダは、無制限のレベルで互いに入れ子にすることができます。私はforeachループを使用する場合、私はお互いにそれらを入れ子にする必要があります入れ子のループの量は、私が読み込むいくつの層を決定します。

    私は最後に到達するまで構造を読んで維持するための動的なソリューションを探しています不要なコードを使用する必要はありません。

    誰にも解決策がありますか?

    PICTURE 1

    構造のイメージ。イメージ内のすべてのフォルダとファイルにオブジェクトとしてアクセスできます。

    PICTURE 2

    構造をループするために使用されるコードの画像。

+1

あなたは再帰的にツリー –

+0

ここにあなたの答えは...ですが横切ることができるhttps://stackoverflow.com/questions/15443815/recursively-walking-through-a-directory-tree-and -listing-file-names –

答えて

0

再帰を行う必要があります。以下のサンプル

static void Main(string[] args) 
     { 
      DeviceUserGroup folder = GetTopLevelGroupAsYouWish(); 
      BuildHierarchy (folder); 
      Console.ReadKey(); 
     } 

     static void BuildHierarchy(DeviceUserGroup userGroup) 
     { 
      try 
      { 
       foreach (Device device in userGroup.Devices) 
        Console.WriteLine(device.Name); 
       foreach (DeviceUserGroup group in userGroup.Groups) 
       { 
        Console.WriteLine(group.Name); 
        BuildHierarchy(group); 
       } 

      } 
      catch (System.Exception ex) 
      { 
       Console.WriteLine(ex.Message); 
      } 
     } 
+0

ファイルパスから構造体にアクセスできないという問題があります。オブジェクトは、外部ソフトウェアプログラムに接続されたAPIから取り出される。これは私に最も高い層のフォルダオブジェクトを与えます。私は再帰を使用することはできませんので、Visual Studioでこのフォルダをローカルに読み込む必要があります。 私は自分のプロセスを示すために別の画像を追加しました。 –

+0

は、図2に基づいてコードを変更しました。 –

1

BFS(https://en.wikipedia.org/wiki/Breadth-first_search)または再帰を使用するのは当然です。 BFSは、階層ごとにディレクトリを検索し、再帰バージョンを使用するとスタックオーバーフローの危険性があります。

例:

static void SearchDir(string dirPath) 
{ 
    Queue<string> queue = new Queue<string>(); 
    queue.Enqueue(dirPath); 

    while(queue.Count() != 0) 
    { 
     var actualDir = queue.Dequeue(); 
     foreach(var file in Directory.GetFiles(actualDire) 
      //Output info about all files in the directory 

     foreach(var dir in Directory.GetDirectories(actualDir) 
     { 
      //Output info about all directories in the directory 
      queue.Enqueue(dir); 
     } 
    } 
} 
関連する問題