C# 如何在无序列表中列出所有目录和子目录
我有一个似乎无法克服的问题。我试图列出所有的目录和子目录。到目前为止,我的代码是这样的:C# 如何在无序列表中列出所有目录和子目录,c#,.net,directoryinfo,C#,.net,Directoryinfo,我有一个似乎无法克服的问题。我试图列出所有的目录和子目录。到目前为止,我的代码是这样的: String[] Folders; String[] Files; path = Server.MapPath("/"); DirectoryInfo dir = new DirectoryInfo(path); Folders = Directory.GetDirectories(path);
String[] Folders;
String[] Files;
path = Server.MapPath("/");
DirectoryInfo dir = new DirectoryInfo(path);
Folders = Directory.GetDirectories(path);
try
{
FolderListing.Append("<ul id=\"FolderList\">");
for (int x = 0; x < Folders.Length; x++ )
{
DirectoryInfo folder = new DirectoryInfo(Folders[x]);
FolderListing.Append("<li>").Append(folder.Name).Append("</li>");
CheckSubdirectories(Folders[x]);
}
FolderListing.Append("</ul>");
FolderList.Text = FolderListing.ToString();
}
catch (Exception exc) //Module failed to load
{
Exceptions.ProcessModuleLoadException(this, exc);
}
}
private void CheckSubdirectories(string currentpath)
{
String[] subfolders = Directory.GetDirectories(currentpath);
if (subfolders.Length != 0)
{
FolderListing.Append("<ul id=\"SubFolderList\">");
}
for (int x = 0; x < subfolders.Length; x++ )
{
DirectoryInfo sfolder = new DirectoryInfo(subfolders[x]);
FolderListing.Append("<li>").Append(sfolder.Name).Append("</li>");
}
if (subfolders.Length != 0)
{
FolderListing.Append("</ul>");
}
path = currentpath.ToString();
}
String[]文件夹;
字符串[]文件;
path=Server.MapPath(“/”);
DirectoryInfo dir=新的DirectoryInfo(路径);
Folders=Directory.GetDirectories(路径);
尝试
{
Append(“”;
对于(int x=0;x”).Append(folder.Name).Append(“”);
检查子目录(文件夹[x]);
}
FolderListing.Append(“”);
Text=FolderListing.ToString();
}
catch(异常exc)//加载模块失败
{
异常。ProcessModuleLoadException(本,exc);
}
}
私有void检查子目录(字符串currentpath)
{
String[]subfolders=Directory.GetDirectories(currentpath);
if(subfolders.Length!=0)
{
Append(“”;
}
对于(int x=0;x”).Append(sfolder.Name).Append(“”);
}
if(subfolders.Length!=0)
{
FolderListing.Append(“”);
}
path=currentpath.ToString();
}
我希望最终结果是:
<ul>
<li>admin</li>
<ul>
<li>Containers</li>
<li>ControlPanel</li>
<li>Menus</li>
<ul>
<li>etc etc</li>
</ul>
</ul>
</ul>
- 管理员
- 容器
- 控制面板
- 菜单
- 等等
如果有人能帮助我,请你可以使用递归方法解决这个问题。为了列出嵌套在任何深度的子目录,您需要一个调用自身的方法
public ListDirectory (DirectoryInfo dir)
{
//TODO: Output the directory info here.
foreach (DirectoryInfo subdir in dir.Directories) {
ListDirectory(subdir);
}
foreach (FileInfo file in dir.Files) {
//TODO: Output the file info here.
}
}
列表在HTML中应该是这样的。请注意,子目录的
必须包含整个嵌套的
- 子目录项1
- 子目录中的文件1
- 子目录中的文件2
- 子目录项2
- 子目录项
- 子目录中的文件1
- 子目录中的文件2
- 子目录中的文件1
- 子目录中的文件2
- 文件项目1
- 文件项目2
这将产生以下输出:
- 子目录项1
- 子目录中的文件1
- 子目录中的文件2
- 子目录项2
- 子目录项
- 子目录中的文件1
- 子目录中的文件2
- 文件项目2
- 子目录项
- ”);输出(目录名称);
如果(dir.Directories.Count>0 | | dir.Files.Count>0){
输出(“
- ”);
foreach(目录目录中的DirectoryInfo子目录){
列表目录(subdir);
}
foreach(dir.Files中的FileInfo文件){
输出(“
- ”);输出(file.Name);输出(“ ”); } 输出(“
”);
}
您还必须将整件物品装入一对
中。此外,您可以在第一级使用稍有不同的方案,以列出文件和目录,而不是像我上面的代码那样只列出一个根目录。这是有效的:Func<DirectoryInfo, XElement[]> getDirectories = null; getDirectories = di => (new [] { new XElement("li", di.Name), di.GetDirectories().Any() ? new XElement("ul", from cdi in di.GetDirectories() select getDirectories(cdi)) : null, }) .Where(x => x != null) .ToArray(); var xml = new XElement("ul", getDirectories( new DirectoryInfo(@"E:\Install\_.NET")));
从示例目录中,我得到以下输出:Func getDirectories=null; getDirectories=di=> (新[] { 新XElement(“li”,di.名称), di.getDirectory().Any() ?新XElement(“ul”, 来自di.GetDirectories()中的cdi 选择GetDirectory(cdi)) :null, }) .其中(x=>x!=null) .ToArray(); var xml=new-XElement(“ul”, 获取目录( 新目录信息(@“E:\Install\\.NET”);
<ul> <li>_.NET</li> <ul> <li>3DCollaborator</li> <li>MercurialVSSProvider</li> <li>MongoDB</li> <li>sqlite</li> <ul> <li>sqlite-netFx35-binary-bundle-Win32-2008-1.0.74.0</li> <li>sqlite-netFx35-binary-Win32-2008-1.0.74.0</li> <li>sqlite-netFx40-binary-Win32-2010-1.0.74.0</li> </ul> </ul> </ul>
希望此递归方法有助于:- _.NET
- 合作者
- MercurialVSSProvider
- 蒙哥达
- sqlite
- sqlite-netFx35-binary-bundle-Win32-2008-1.0.74.0
- sqlite-netFx35-binary-Win32-2008-1.0.74.0
- sqlite-netFx40-binary-Win32-2010-1.0.74.0
void ListDirectories(string path, StringBuilder sb) { var directories = Directory.GetDirectories(path); if (directories.Any()) { sb.AppendLine("<ul>"); foreach (var directory in directories) { var di = new DirectoryInfo(directory); sb.AppendFormat("<li>{0}</li>", di.Name); sb.AppendLine(); ListDirectories(directory, sb); } sb.AppendLine("</ul>"); } }
您应该了解一种称为递归的技术,请参见示例void ListDirectories(string path, StringBuilder sb) { var directories = Directory.GetDirectories(path); if (directories.Any()) { sb.AppendLine("<ul>"); foreach (var directory in directories) { var di = new DirectoryInfo(directory); sb.AppendFormat("<li>{0}</li>", di.Name); sb.AppendLine(); ListDirectories(directory, sb); } sb.AppendLine("</ul>"); } }
var sb = new StringBuilder(); ListDirectories(Server.MapPath("/"), sb);