【问题标题】:How do i list all directories and subdirectories in an unordered list如何在无序列表中列出所有目录和子目录
【发布时间】:2012-07-16 12:13:21
【问题描述】:

我有这个似乎无法克服的问题。我正在尝试列出所有目录和子目录。这是我到目前为止的代码:

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

我希望最终结果是:

<ul>
    <li>admin</li>
    <ul>
        <li>Containers</li>
        <li>ControlPanel</li>
        <li>Menus</li>
        <ul>
            <li>etc etc</li>
        </ul>
    </ul>
</ul>

如果有人可以帮助我,请

【问题讨论】:

标签: c# .net directoryinfo


【解决方案1】:

这行得通:

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

从我的示例目录我得到了这个输出:

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

【讨论】:

    【解决方案2】:

    希望这种递归方法有帮助:

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

    要调用它,只需创建一个StringBuilder 的实例并将其与方法的路径一起发送:

    var sb = new StringBuilder();
    ListDirectories(Server.MapPath("/"), sb);
    

    【讨论】:

      【解决方案3】:

      您可以使用递归方法来解决问题。您需要一个调用自身的方法,以便列出嵌套在任意深度的子目录。

      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 中应如下所示。请注意,子目录的&lt;li&gt; 必须包含整个嵌套的&lt;ul&gt;

      <ul> 
          <li>subdirectory item 1
              <ul> 
                  <li>file 1 in subdirectory</li> 
                  <li>file 2 in subdirectory</li> 
              </ul> 
          </li> 
          <li>subdirectory item 2
              <ul> 
                  <li>sub-subdirectory item
                      <ul> 
                          <li>file 1 in sub-subdirectory</li> 
                          <li>file 2 in sub-subdirectory</li> 
                      </ul> 
                  </li> 
                  <li>file 1 in subdirectory</li> 
                  <li>file 2 in subdirectory</li> 
              </ul> 
          </li> 
          <li>file item 1</li> 
          <li>file item 2</li> 
      </ul>
      

      这将产生以下输出:

      • 子目录项 1
        • 子目录中的文件 1
        • 子目录中的文件 2
      • 子目录项2
        • 子子目录项
          • 子目录中的文件1
          • 子子目录中的文件2
        • 子目录中的文件1
        • 子目录中的文件2
      • 文件项1
      • 文件项2

      有了这些信息,我们可以细化上面的方法(伪代码)

      public ListDirectory (DirectoryInfo dir)
      {
           Output("<li>");    Output(dir.Name);
               if (dir.Directories.Count > 0 || dir.Files.Count > 0) {
                   Output("<ul>");
                   foreach (DirectoryInfo subdir in dir.Directories) {
                       ListDirectory(subdir);
                   }
                   foreach (FileInfo file in dir.Files) {
                       Output("<li>");  Output(file.Name);  Output("</li>");
                   }
                   Output("</ul>");
               }
           Output("</li>");
      }
      

      您还必须将整个内容包含在 &lt;ul&gt; &lt;/ul&gt; 对中。此外,您可以在第一级使用稍微不同的方案,以便列出文件和目录,而不是像我上面的代码那样仅列出一个根目录。

      【讨论】:

        猜你喜欢
        • 2011-11-09
        • 2016-01-16
        • 2012-11-14
        • 2012-09-02
        • 2014-10-16
        • 1970-01-01
        • 2011-06-22
        相关资源
        最近更新 更多