2012-04-12 3 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

당신은 두 가지 유형을 반환 할 수 없습니다. 디렉토리와 폴더 경로/이름으로 충분하다면,'List '에 추가하고 그것을 반환 할 수 있습니다. – Oded

+0

기능을 분리 할 수 ​​있습니다. 'Folders'를 반환하는 매개 변수가없는 파일과'Folders' 목록을 가진 두 번째 파일 중 하나가'Files'를 반환하는 매개 변수로 사용합니다 – Loci

+1

'FileInfo'는'FullName','Name' 및'Directory' 속성을가집니다. 필요한 것. – Reniuz

답변

3

두 튜플을 사용할 수 있습니다. 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 나는 무엇이 잘못 될지 알지 못합니다. 내 대답은 자신의 일반적인 질문 _ "함수에서 두 가지 유형을 반환하는 방법"입니다. _ – 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; 
} 

은 물론 당신이 코드에서 몇 가지 조건 처리를해야 할 수도 있습니다.

+0

+1 사실 더 좋은 해결책입니다. :) 특정 클래스의 속성을 얻으려면 그는 캐스팅해야합니다. – gideon

+0

수락 담당자가 있습니다.) –

1

당신은 사용할 수있는 Dictionary<DirectoryInfo, List<FileInfo>> :

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()); 
관련 문제