递归文件/文件夹列表循环

时间:2013-11-22 22:36:13

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

如何进入递归循环? 首先,我想循环出文件夹和文件列表,当然这些文件应该在各自的文件夹中,我将通过HTML和CSS在Web上显示列表。 我有一个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>
    }

2 个答案:

答案 0 :(得分:2)

我会将DisplayTemplate用于文件夹。这将渲染其中的所有文件夹,将其自身用作模板,从而进行递归。

答案 1 :(得分: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 ... 
}