Список папок в каталоге с использованием asp.net и C#

.aspx-файл:

<%@ Import Namespace="System.IO" %>
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title>Explorer</title>
</head>
<body>
<form id="form1" runat="server">
</form>
</body>
</html>

.CS-файл:

 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Web;
 using System.Web.UI;
 using System.Web.UI.WebControls;
 using System.IO;

public partial class view2 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
    string path = "~/";
    GetFilesFromDirectory(path);
}

private static void GetFilesFromDirectory(string DirPath)
{
         try
         {
             DirectoryInfo Dir = new DirectoryInfo(DirPath);
             FileInfo[] FileList = Dir.GetFiles("*.*", SearchOption.AllDirectories);
             foreach (FileInfo FI in FileList)
             {
                 Console.WriteLine(FI.FullName);
             }
         }
         catch (Exception ex)
         {
                Console.WriteLine(ex.Message);
         }
}

Я хочу перечислить папки в определенном каталоге, но он постоянно показывает пустую страницу. Может ли кто-нибудь сказать, в чем проблема в коде.


person Naresh    schedule 18.05.2011    source источник


Ответы (5)


Отображение каталогов и файлов на пустой странице

// YourPage.aspx
<%@ Import Namespace="System.IO" %>
<html>
<body>
    <% foreach (var dir in new DirectoryInfo("E:\\TEMP").GetDirectories()) { %>
        Directory: <%= dir.Name %><br />

        <% foreach (var file in dir.GetFiles()) { %>
            <%= file.Name %><br />
        <% } %>
        <br />
    <% } %>
</body>
</html>
person benwasd    schedule 18.05.2011
comment
Я пытаюсь сделать что-то подобное, но я не хочу использовать статический путь. Есть ли способ получить путь к приложению? например, ~/Uploads/ и Uploads — это папка внутри моего веб-проекта. Я не хочу иметь это: C://Visual Studio 2013/projects/my project и т. д. - person ThunD3eR; 08.09.2014
comment
@Ra3IDeN да, используйте HttpContext.Current.Server.MapPath(StringPathInSolution) , однако, поскольку путь к вашему проекту статичен и, следовательно, известен, вы можете удалить его из строки? - person LokizFenrir; 29.01.2015
comment
в моем случае он не загружает файлы - person Hammad Khan; 20.07.2016

Не используйте Console.WriteLine(), используйте Response.Write(). Вы пытаетесь писать в консоль в веб-приложении.

person Richard Marskell - Drackir    schedule 18.05.2011
comment
Я получаю эту ошибку: требуется ссылка на объект для нестатического поля, метода или свойства «System.Web.UI.Page.Response.get». - person Naresh; 18.05.2011
comment
@ILLUMINATI7590: О, уберите static из private static void GetFilesFromDirectory(string DirPath). В данном случае он вам не нужен. - person Richard Marskell - Drackir; 18.05.2011
comment
Спасибо. Ошибка устранена. Но моя веб-страница по-прежнему ничего не показывает. - person Naresh; 18.05.2011
comment
@ ILLUMINATI7590: Вы уверены, что ошибок нет? Вы заменили оба экземпляра Console.WriteLine()? - person Richard Marskell - Drackir; 18.05.2011
comment
да, я заменил все экземпляры и все равно ничего не получаю. Получение страницы так же, как и раньше. - person Naresh; 18.05.2011
comment
Попробуйте поставить точку останова (при условии, что вы работаете из IDE) в методе GetFilesFromDirectory и посмотреть, сможете ли вы перейти к нему (F11, пока выполнение приостановлено в точке останова). - person Richard Marskell - Drackir; 18.05.2011
comment
По моему мнению, Response.Write не работает при Page_Load/Pre_Init и подобных событиях. Ответ будет очищен перед рендерингом aspx. - person benwasd; 18.05.2011
comment
Я не мог этого понять. Но не могли бы вы помочь мне просто отображать папки (не подпапки) так, как сказал Бенджамин. - person Naresh; 18.05.2011
comment
@ ILLUMINATI7590: Если это не сработало для вас, а для Бенджамина сработало, вы должны предоставить ответ ему, а не мне. Я уверен, что он сможет помочь вам со своим кодом. :) - person Richard Marskell - Drackir; 18.05.2011

Console.WriteLine будет писать в консоль, а не в содержимое веб-страницы, которое вы возвращаете. Вам нужно добавить элемент контейнера на страницу ASPX, возможно, представление сетки или повторитель, а затем добавить назначение списка файлов из кода позади файла (к добавленному элементу HTML используйте тег runat='server' и назначьте ему ID, а затем ссылайтесь на него по имени ID в коде).

person toby    schedule 18.05.2011

Response.Write в статическом методе кода программной части: DIRTY! Кроме того, вы не контролировали позицию, в которой пишете. Это немного чище...

// YourPage.aspx
<%@ Import Namespace="System.IO" %>
<html>
<body>
    <ul>
        <% foreach(var file in Directory.GetFiles("C:\\Temp", "*.*", SearchOption.AllDirectories)) { %>
        <li><%= file %></li>       
        <% } %>     
    </ul>
</body>
</html>
person benwasd    schedule 18.05.2011
comment
У тебя есть <li> и <ul> mixed up. Also, I do agree with you but the user seems to just be doing something basic right now (the page is blank and there's nothing else in the code-behind) so I didn't really see the point of getting into perfecting the display. Also, I didn't even notice that the method was static`, хорошие глаза. :) - person Richard Marskell - Drackir; 18.05.2011
comment
Большое спасибо. Я очень новичок в кодировании. - person Naresh; 18.05.2011
comment
Скажите, пожалуйста, это. Я просто хочу отображать папки в каталоге (а не вложенные папки). В вашем коде замените файлы каталогами, указав каждую папку в нем. - person Naresh; 18.05.2011

Вы можете использовать класс каталога

  • Первый параметр — это путь, он может быть относительным или абсолютным.
  • Второй параметр для сопоставления с именами подкаталогов в пути. Этот параметр может содержать комбинацию допустимых буквенных и подстановочных знаков, но не поддерживает регулярные выражения.

/

//using System.IO; 
private void GetDirectories()
{
    DataTable dt = new DataTable();
    dt.Columns.Add("direction",typeof(string));
    try
    {
        string[] dirs = Directory.GetDirectories(@"yourpath", "*", SearchOption.AllDirectories);
        foreach (string dir in dirs)
        {
            dt.Rows.Add(dir);
        }
        if (dirs.Length <= 0)
        {
             lbl.text="your message"

        }

       rpt.DataSource = dt; //your repeater 
       rpt.DataBind(); //your repeater 
    }
    catch (Exception e)
    {
       lbl.text="your message"//print message assign it to label
    }
}

На странице aspx

   <asp:Label runat="server" ID="lbl"></asp:Label>
    <asp:Repeater ID="rpt" runat="server" ClientIDMode="AutoID">
        <ItemTemplate>
            <tr>
                <td><%#Eval("direction")%></td>

            </tr>
        </ItemTemplate>
    </asp:Repeater>
person mohannad wallo    schedule 29.10.2019