簡體   English   中英

如何在無序列表中列出所有目錄和子目錄

[英]How do i list all directories and subdirectories in an unordered list

我有這個問題,我似乎無法克服。 我試圖列出所有目錄和子目錄。 這是我到目前為止的代碼:

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>

如果有人可以幫助我

這有效:

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>

您可以使用遞歸方法解決問題。 您需要一種調用自身的方法以列出嵌套在任何深度的子目錄。

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中應如下所示。 請注意,子目錄的<li>必須包含整個嵌套的<ul>

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

您還必須將整個內容括在<ul> </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>");
    }
}

要調用它,只需創建StringBuilder一個實例,並將其與方法的路徑一起發送:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM