【问题标题】:Recursive files/folder list loop out递归文件/文件夹列表循环出
【发布时间】:2013-11-22 22:36:12
【问题描述】:

如何进入递归循环? 首先,我想循环出文件夹和文件的列表,当然这些文件应该在它们各自的文件夹中,我将通过 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="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>
    }

【问题讨论】:

  • 你想打印整个文件/目录树吗?
  • @kaptan 内容文件夹内的整个目录/文件树,是的。当前文件夹和文件列表已经包含所有内容,但不确定如何正确打印出来

标签: c# .net system.io.fileinfo system.io.directory


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    你不能使用 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 ... 
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-31
    • 1970-01-01
    • 2021-03-21
    • 1970-01-01
    • 2020-06-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-27
    相关资源
    最近更新 更多