1

我如何进入递归循环?首先,我想循环出文件夹和文件的列表,当然这些文件应该在它们各自的文件夹中,我将通过 HTML 和 CSS 在网络上显示列表。我有 aList<DirectoryInfo>和 aList<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="folder-@i">@folder.Name</label> <input type="checkbox" id="folder-@i" /> 
        <ol>
        @foreach (DirectoryInfo subFolder in ViewBag.folders)
        {
            if (folder.Name == subFolder.Parent.ToString())
            {
                <li>
                <label for="subfolder-@subFolderi">@subFolder.Name</label> <input type="checkbox" id="subfolder-@subFolderi" /> 
                <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="folder-@folder.Name">@folder.Name</label> <input type="checkbox" id="folder-@folder.Name" />
            <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>
    }
4

2 回答 2

2

我会使用 DisplayTemplate 作为文件夹。这将使用自身作为模板呈现其中的所有文件夹,从而进行递归。

于 2013-11-22T22:50:58.197 回答
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 ... 
}
于 2013-11-22T23:04:58.893 回答