2

我正在开发一个 asp.net 文件浏览器,它递归地遍历文件夹并列出它们的文件和子文件夹。但是,我也想让文件可以下载/查看,我似乎有问题。我无法正确转换地址。我有以下配置和代码。

编辑

问题是创建的链接

Response.Write(space + "<a href=" + "Upload/" + d.Name + ">" + d.FullName + "</a><br/>");

不要正确链接到文件。还有一个我需要解决的额外问题:一些文件名包含空格。

网页配置

<appSettings>
  <add key="UploadDirectory" value="~/Upload/"/>
</appSettings>

文件浏览器.aspx.cs

public partial class FileBrowser : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {        
        DirectoryInfo di = new DirectoryInfo(Request.MapPath(System.Configuration.ConfigurationManager.AppSettings["UploadDirectory"]));
        if (Directory.Exists(di.ToString()))
            printDir("", di.ToString());

    }

    protected void printDir(string space, string dir)
    {
        DirectoryInfo di = new DirectoryInfo(dir);
        foreach (DirectoryInfo d in di.GetDirectories())
        {
            Response.Write(space + "<a href=" + d.ToString() + ">" + d.ToString() + "</a><br/>");
            printDir(space + "&nbsp;&nbsp;&nbsp;&nbsp;", dir + "\\" + d.ToString());
        }

        foreach (FileInfo d in di.GetFiles())
        {
            Response.Write(space + "<a href=" + "Upload/" + d.Name + ">" + d.FullName + "</a><br/>");
        }
    }
}
4

3 回答 3

1

你有没有尝试过这样的事情?

foreach (FileInfo d in di.GetFiles())
{
    Response.Write(space + "<a href=" + Server.MapPath("~/Upload/") + d.Name + ">" + d.FullName + "</a><br/>");
}
于 2011-06-20T11:22:27.353 回答
1

问题是在渲染子文件夹中文件的路径时,您使用的是“上传/文件名”之类的路径;这是不正确的。

实际上,您应该尝试从当前 di 变量中获取目录名称。也就是说,如果您当前正在浏览“上传”文件夹中的“内部”文件夹,您的路径将类似于“上传/内部/文件名”。

这是您需要进行更改的地方:

  Response.Write(space + "<a href=" + "Upload/" + d.Name + ">" + d.FullName + "</a><br/>");

在上面的代码行中,您需要根据 di 变量中的路径动态创建 href URL。请执行下列操作:

  1. 获取di路径
  2. 获取di路径中“\Upload”后的子串
  3. 用“\”分割上面的子串;这将为您提供任何子目录。
  4. 使用上述子目录创建文件的新路径。

我希望这有帮助。

于 2011-06-20T12:06:08.040 回答
1

这更具可读性:

foreach (FileInfo d in di.GetFiles("*", SearchOption.AllDirectories)) // includes subfolders
{
    Response.Write(String.Format("{0}<a href=\"{1}\">{2}</a>", space, Server.MapPath("~/Upload/") + d.Name, d.FullName);
}

也试试DirectoryInfo.EnumerateFile()

于 2011-06-20T12:09:11.567 回答