Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在无序列表中列出所有目录和子目录_C#_.net_Directoryinfo - Fatal编程技术网

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);