2013-11-22 80 views
1

如何進入遞歸循環? 首先,我想循環列出文件夾和文件,當然這些文件應該放在它們各自的文件夾中,我要通過HTML和CSS在網頁上顯示列表。 我有一個List<DirectoryInfo>和一個List<FileInfo>用於存儲我的文件夾和文件。遞歸文件/文件夾列表循環出

我可以在我看來這樣做一個基本的foreach循環:

@foreach (DirectoryInfo folder in ViewBag.folders) 
    { 
     <p>@folder.Name</p> 
     foreach (FileInfo file in ViewBag.files) 
     { 
      if (folder.FullName == file.DirectoryName) 
      { 
       <p class="file" data-url="@file.FullName.Substring(file.DirectoryName.IndexOf("Content"))" style="margin-left:20px;">@file.Name</p> 
      } 
     } 
    } 

而這個工作,它會顯示在各自的文件夾中的所有文件夾和文件。 但是,這裏出現的問題正如您可能已經猜到的那樣,子文件夾。 當前所有文件夾都在同一個列表中,包括子文件夾。

我可以做這樣的事情

<ol class="tree"> 
    @{ 
     int i = 1; 
     int subFolderi = 1; 
    foreach (DirectoryInfo folder in ViewBag.folders) 
    { 
     <li> 
     <label for="[email protected]">@folder.Name</label> <input type="checkbox" id="[email protected]" /> 
     <ol> 
     @foreach (DirectoryInfo subFolder in ViewBag.folders) 
     { 
      if (folder.Name == subFolder.Parent.ToString()) 
      { 
       <li> 
       <label for="[email protected]">@subFolder.Name</label> <input type="checkbox" id="[email protected]" /> 
       <ol> 
       @foreach (FileInfo file in ViewBag.files) 
       { 
        if (subFolder.FullName == file.DirectoryName) 
        { 
         <li class="file" data-url="@file.FullName.Substring(file.DirectoryName.IndexOf("Content"))">@file.Name</li> 
        } 
       } 
       </ol> 
       </li> 
      } 
      subFolderi++; 
     } 
     @foreach (FileInfo file in ViewBag.files) 
     { 

      if (folder.FullName == file.DirectoryName) 
      { 
       <li class="file" data-url="@file.FullName.Substring(file.DirectoryName.IndexOf("Content"))">@file.Name</li> 
      } 
     } 
     </ol> 
     </li> 
     i++; 
    } 
    } 
    </ol> 

,它就會把自己的父文件夾內的子文件夾,但是這顯然只適用於子文件夾的第一層,而不是文件夾內的子文件夾。 而且它還會將這些子文件夾顯示兩次,一次顯示在其父文件夾中,一次顯示在主文件夾列表中。

現在的問題是,我應該做一個遞歸循環來繼續獲取子文件夾內的子文件夾及其文件,或者我應該做某種形式的LINQ來將所有事先組合起來以使循環更容易? 還是有更好的方法來做到這一點? 我更喜歡乾淨的方式,因爲我仍然可以控制HTML/CSS,所以沒有jQuery插件或ASP控件使用數據源,然後自動創建所有內容。

工作液

<ol class="tree"> 
    @printFolder(ViewBag.contentFolder) 
    </ol> 

    @helper printFolder(DirectoryInfo folder) 
    { 
     <li> 
      <label for="[email protected]">@folder.Name</label> <input type="checkbox" id="[email protected]" /> 
      <ol> 
        @foreach(DirectoryInfo subFolder in folder.GetDirectories()) 
        { 
         @printFolder(subFolder) 
        } 
        @foreach(FileInfo file in folder.GetFiles()) 
        { 
         @printFile(file) 
        } 
      </ol> 
     </li> 
    } 
    @helper printFile(FileInfo file) 
    { 
     <li class="file" data-url="@file.FullName.Substring(file.DirectoryName.IndexOf("Content"))">@file.Name</li> 
    } 
+0

是否要打印整個文件/目錄樹? – kaptan

+0

@kaptan內容文件夾中的整個目錄/文件樹,是的。當前的文件夾和文件列表已包含所有內容,但不知道如何正確打印 – HenrikP

回答

1

不能使用DirectoryInfo的GetFiles()和GetDirectories()來打印整個文件樹嗎?例如:

foreach (var folder in folders) 
    PrintFolder(folder); 

PrintFolder(DirectoryInfo folder) 
{ 
    // ... print folder name here ... 

    foreach(var subFolder in folder) 
    PrintFolder(folder); 

    foreach(var file in folder.GetFiles()) 
    PrintFile(file); 

} 

PrintFile(FileInfo file) 
{ 
    // ... print file name here ... 
} 
+0

我應該打印什麼,以及如何將其與我的HTML集成? – HenrikP

+0

使用@helper關鍵字(http://stackoverflow.com/a/6423891/266659)在Razor中編寫遞歸函數。 – kaptan

2

我會用一個DisplayTemplate的文件夾。這將使用其自身作爲模板呈現其內的所有文件夾,從而進行遞歸。