【发布时间】: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