2012-04-12 10 views
2

ファイルが入っているフォルダのリストを返すにはどうすればいいですか?ファイルが入っているフォルダの一覧を返すにはどうしたらいいですか?

リストの両方を返すことができないため、両方のタイプをリストに入れることができないためです。

public List<DirectoryInfo> GetTopFolders() 
    { 
     List<DirectoryInfo> Folders = new List<DirectoryInfo>(); 
     List<FileInfo> Files = new List<FileInfo>(); 

     System.IO.DirectoryInfo di = new System.IO.DirectoryInfo("C://inetpub//wwwroot//Files//"); 
     di.GetDirectories(); 
     System.IO.FileInfo[] fiArr = di.GetFiles(); 

     foreach (DirectoryInfo t in di.GetDirectories()) 
     { 
      Folders.Add(t); 
      foreach (FileInfo f in di.GetFiles()) 
      { 
       Files.Add(f); 
      } 
     } 
     return Folders; 
    } 

これは私が実際に使用しているコードです。

+0

次の2つの異なるタイプを返すことができません。ディレクトリとフォルダのパス/名前があれば、 'List 'に追加して返すことができます。 – Oded

+0

機能を分離することができます。 'Folders'を返すパラメータを持たないものと' Folders'リストを返すパラメータとして 'File'を返すものは – Loci

+1

' FileInfo'は 'FullName'、' Name'と 'Directory'プロパティを持っています必要。 – Reniuz

答えて

3

2タプルを使用できます。あなたはこのようにそれを使用Tuple.Create on msdn

public Tuple<List<DirectoryInfo>,List<FileInfo>> GetTopFolders() 
{ 
    List<DirectoryInfo> Folders = new List<DirectoryInfo>(); 
    List<FileInfo> Files = new List<FileInfo>(); 

    /* All your other code here */ 
    /* Removed for brevity*/ 
    foreach (DirectoryInfo t in di.GetDirectories()) 
    { 
     Folders.Add(t); 
     foreach (FileInfo f in di.GetFiles()) 
     { 
      Files.Add(f); 
     } 
    } 
    return Tuple.Create(Folders, Files); 
} 

を参照してください:

var fileAndFolders = GetTopFolders() 
fileAndFolders.Item1 //will be your folders of type List<DirectoryInfo> 
fileAndFolders.Item2 //will be your folders of type List<FileInfo> 
+0

@Oded私は間違っているかどうかわかります。私の答えは彼の一般的な質問です。_ "関数から2つの型を返すにはどうすればいいですか" _ – gideon

5

まあ、FileInfoオブジェクトとDirectoryInfoの両方がFileSystemInfoから継承します。だから、代わりにそのタイプのリストを維持することができ、一緒に全体の多くを返す:もちろん

public List<FileSystemInfo> GetTopFoldersAndFiles() 
{ 
    List<FileSystemInfo> FilesAndFolders = new List<FileSystemInfo>(); 

    System.IO.DirectoryInfo di = new System.IO.DirectoryInfo("C://inetpub//wwwroot//Files//"); 
    di.GetDirectories(); 
    System.IO.FileInfo[] fiArr = di.GetFiles(); 

    foreach (DirectoryInfo t in di.GetDirectories()) 
    { 
     FilesAndFolders.Add(t); 
     foreach (FileInfo f in di.GetFiles()) 
     { 
      FilesAndFolders.Add(f); 
     } 
    } 
    return FilesAndFolders; 
} 

をあなたは、各アイテムの種類に基づいて、このオブジェクトを利用するコードにいくつかの条件付きの取り扱いが必要になる場合があります。あなたはDictionary<DirectoryInfo, List<FileInfo>>を使用することができます

+0

+1これはより洗練されたソリューションです。 :)特定のクラスのプロパティを取得するには、彼はキャストする必要があります。 – gideon

+0

あなたは受け入れ担当者を持っています;) –

1

private Dictionary<DirectoryInfo, List<FileInfo>> GetTopFolders() 
{ 
    Dictionary<DirectoryInfo, List<FileInfo>> r = new Dictionary<DirectoryInfo, List<FileInfo>>(); 


    DirectoryInfo di = new DirectoryInfo("C://inetpub//wwwroot//Files//"); 
    di.GetDirectories(); 

    r.Add(di, di.GetFiles().ToList()); 

    foreach (DirectoryInfo t in di.GetDirectories()) 
    { 
     r.Add(t, t.GetFiles().ToList()); 
    } 

    return r; 
} 

あなたは、このようなあなたのフォルダやファイルを一覧表示することができます。

StringBuilder sb = new StringBuilder(); 

foreach (KeyValuePair<DirectoryInfo, List<FileInfo>> item in GetTopFolders()) 
{ 
    sb.AppendLine(item.Key.FullName); 

    foreach (FileInfo file in item.Value) 
    { 
     sb.AppendLine("\t" + file.Name); 
    } 
} 

Console.WriteLine(sb.ToString()); 
関連する問題