2011-05-26 86 views

回答

4

該代碼會做什麼其他的答案都在做,但也返回文件夾名稱(因爲這似乎是你所要求的一部分)。這將需要.Net 4.0。如果你想跟蹤哪些是文件夾,哪些是文件,你可以返回一個包含文件列表和文件夾列表的元組。

List<string> GetFilesAndFolders(string root, int depth) 
{ 
    var list = new List<string>(); 
    foreach(var directory in Directory.EnumerateDirectories(root)) 
    { 
     list.Add(directory); 
     if (depth > 0) 
     { 
      list.AddRange(GetFilesAndFolders(directory, depth-1)); 
     } 
    } 

    list.AddRange(Directory.EnumerateFiles(root)); 

    return list; 
} 

編輯:代碼,保持文件夾和文件分開

Tuple<List<string>,List<string>> GetFilesAndFolders(string root, int depth) 
{ 
    var folders = new List<string>(); 
    var files = new List<string>(); 
    foreach(var directory in Directory.EnumerateDirectories(root)) 
    { 
     folders.Add(directory); 
     if (depth > 0) 
     { 
       var result = GetFilesAndFolders(directory, depth-1); 
       folders.AddRange(result.Item1); 
       files.AddRange(result.Item2); 
     } 
    } 

    files.AddRange(Directory.EnumerateFiles(root)); 

    return new Tuple<List<string>,List<string>>(folders, files); 
} 
+0

那麼你必須清理調用者中的文件夾/文件... – 2011-05-26 16:53:18

+0

而'上方'並不是一個很好的參考機制。查看排序標籤。 – 2011-05-26 16:54:14

+0

就排序而言,這很容易添加,或帶回多個列表,問題說的是文件夾和文件列表......所以我這樣寫了。就上述參考而言,你是對的,匆忙而沒有想到它,將會進行編輯 – pstrjds 2011-05-26 16:59:52

2

我感覺好像之前已經解決了。基本上你想要做的是詢問當前的文件,如果它是一個目錄,如果爲真,並且x還沒有最大化,但抓取該文件的子目錄。此外,您需要檢查該目錄中是否存在文件並檢索它們。

2

好的,這是一個簡單的解決方案。

private static IList<string> GetFilesToDepth(string path, int depth) 
{ 
    var files = Directory.EnumerateFiles(path).ToList(); 

    if (depth > 0) 
    { 
     var folders = Directory.EnumerateDirectories(path); 

     foreach (var folder in folders) 
     {      
      files.AddRange(GetFiles(folder, depth - 1)); 
     } 
    } 

    return files; 
} 

這可能是有吸引力的,以改變這種爲EnumFilesToDepth(),即擺脫ToList的()。這需要更多的思考和工作,但遞歸迭代器很棘手。

2

如果你只是想要文件名,你可以用遞歸方法做到這一點。類似的東西: (無garantee總正確性,我寫不編譯)

public static List<String> GetSubfoldersAndFiles(DirectoryInfo di, int deep) 
    { 
     List<string> myContent = new List<string>(); 
     foreach(FileInfo fi in di.GetFiles()) 
     { 
      myContent.Add(fi.FullName); 
     } 

     if(deep > 0) 
     { 
      foreach(DirectoryInfo subDi in di.GetDirectories()) 
      { 
       myContent.AddRange(GetSubfoldersAndFiles(subDi, deep - 1).ToArray()); 
      } 
     } 

     return myContent; 
    } 

和調用將是這樣的:

List<string> content = GetSubfoldersAndFiles(new DirectoryInfo(@"c:\", 3)); 
+1

其實你'--deep'將使這一失敗。避免'++'和'--',post或pre的另一個原因。 – 2011-05-26 16:27:19

+0

多數民衆贊成那不是真的, - 深淵將做我完全所期望的。爲什麼它會失敗? – fixagon 2011-05-26 16:43:13

+2

您需要將--deep調用移到foreach外部,否則您將錯誤地搜索子目錄,除非只有1個(只要想象將其稱爲您的示例列表,深度爲3,頂部文件夾包含3個子文件夾,當你到達第二個子文件夾時,你只會搜索它的深度爲1,第三你不會遞歸搜索) – pstrjds 2011-05-26 16:47:38

1

所有子文件夾

public List<string> listDir(string pPath) 
     { 
      List<string> dirList = new List<string>(); 
      listDir(pPath, dirList); 
      return dirList; 
     } 
private void listDir(string pPath, List<string> pList) 
     { 
       string[] loDirs = System.IO.Directory.GetDirectories(pPath); 
       foreach (string loDir in loDirs) 
       { 
        pList.Add(loDir); 
        listDir(loDir, pList); 
       } 
     } 
相關問題