gpt4 book ai didi

asp-classic - 列出经典 ASP 中的文件夹结构

转载 作者:行者123 更新时间:2023-12-04 18:14:25 27 4
gpt4 key购买 nike

我在 ASP 中为我工作的公司开发了一个安全页面。有一个登陆(登录页面),一旦您通过身份验证,您就会被带到一个页面,该页面包含指向多个子页面的链接。每个子页面都有一个文件夹结构。例如: 有一个 session 纪要标题,然后在下面并缩进的是引用包含信息的 PDF 的链接。可能有 3 或 4 个标题与下方链接的文档。

原始版本有一个 PHP 脚本,该脚本运行并会从一个文件夹结构同步服务器上的实时站点,该文件夹结构将被模仿到实时站点上。因此,如果我有一个名为 Folder1 的文件夹和名为 test1 test2 test3 的子文件夹......实时站点将相应地显示它们。由于该站点现在使用 ASP 而不是 PHP ..PHP 脚本不再有效(因为 PHP 不能很好地与 ASP 配合使用)。

我在网上找到了一个片段,它有点适用于我想要实现的目标(即文件夹/子文件夹/文件名结构),但是我目前对如何链接文件感到困惑,以便在单击时打开它们。我一直在文件名中看到 %25。我知道 %20 与空格相同,并且由于我正在处理包含空格的文件和文件夹名称,这似乎是我的问题。我试过添加 %20 但空格变成了“%2520”。

如果您查看下面的代码,会发现底部有一个名为“MapURL”的链接。当我试图找出 %25 的来源时,我将该链接注释掉了。
任何人都对如何使链接起作用有任何想法吗?

这是片段。

dim path 
path = "PATH TO THE FOLDER ON THE SERVER"

ListFolderContents(path)

sub ListFolderContents(path)

dim fs, folder, file, item, url
set fs = CreateObject("Scripting.FileSystemObject")
set folder = fs.GetFolder(path)

'Display the target folder and info.

Response.Write("<ul><b>" & folder.Name & "</b>") '- " _
' & folder.Files.Count & " files, ")
'if folder.SubFolders.Count > 0 then
' Response.Write(folder.SubFolders.Count & " directories, ")
'end if
'Response.Write(Round(folder.Size / 1024) & " KB total." _
' & "</ul>" & vbCrLf)

Response.Write("<ul>" & vbCrLf)

'Display a list of sub folders.

for each item in folder.SubFolders
ListFolderContents(item)
next

'Display a list of files.

for each item in folder.Files
'url = MapURL(item.path)
'Response.Write("<li><a href=" & url & ">" & item.Name & "</a> - " _

Response.Write("<li><a href=" & Replace(item.path," ","%") & ">" & item.Name & "</a> - " _
& item.Name & "</a>" _
& "</li>" & vbCrLf)
next

Response.Write("</ul>" & vbCrLf)
Response.Write("</ul>" & vbCrLf)

end sub

function MapURL(path)

dim rootPath, url

'Convert a physical file path to a URL for hypertext links.

rootPath = Server.MapPath("/")
url = Right(path, Len(path) - Len(rootPath))
MapURL = Replace(url, "\", "/")

end function

最佳答案

您的代码有几处错误。

  • 首先,您根本不对输出的值进行编码。这是一个大错误。您失踪了 URL 编码 对于进入 HREF 属性的内容,您会错过 HTML 编码 对于其他一切。
  • 接下来,您创建一个新的 FileSystemObject每次调用递归 ListFolderContents()功能。这会造成不必要的浪费,而且一旦要输出的文件数量过多,速度就会变慢。
  • 您的递归函数应该采用 Folder object 作为第一个参数,而不是路径。这让事情变得容易多了。
  • 您输出的 HTML 结构无效。 <b>不能合法地成为 <ul> 的 child .

  • 我完全重写了您的代码以产生更正确的输出并尽可能快。您的问题的关键是 PathEncode()函数,它将相对路径转换为正确编码的 URL。其他事情应该是不言自明的:

    ListFolder "P:\ATH\TO\THE\FOLDER\ON\THE\SERVER"

    ' -- Main Functions ----------------------------------------------------
    Sub ListFolder(path)
    Dim fs, rootPath

    Set fs = CreateObject("Scripting.FileSystemObject")
    rootPath = Replace(path, Server.MapPath("/"), "") & "\"

    ListFolderContents fs.GetFolder(path), PathEncode(rootPath)
    End Sub

    ' ----------------------------------------------------------------------
    Sub ListFolderContents(folder, relativePath)
    Dim child

    Say "<ul>"
    Say "<li><div class=""folder"">" & h(folder.Name) & "</div>"

    For Each child In folder.SubFolders
    If Not IsHidden(child) Then
    ListFolderContents child, relativePath & PathEncode(child.Name) & "/"
    End If
    Next

    relativePath = h(relativePath)

    For Each child In folder.Files
    If Not IsHidden(child) Then
    Say "<li><a href=""" & relativePath & h(PathEncode(child.Name)) & """>" & h(child.Name) & "</a></li>"
    End If
    Next

    Say "</ul>"
    End Sub

    ' -- Helper Functions / Shorthands ---------------------------------------
    Sub Say(s)
    Response.Write s & vbNewLine
    End Sub

    Function h(s)
    h = Server.HTMLEncode(s)
    End Function

    Function PathEncode(s)
    ' this creates a more correct variant of what Server.URLEncode would do
    PathEncode = Replace(s, "\", "/")
    PathEncode = Server.URLEncode(PathEncode)
    PathEncode = Replace(PathEncode, "+", "%20")
    PathEncode = Replace(PathEncode, "%2F", "/")
    PathEncode = Replace(PathEncode, "%2E", ".")
    PathEncode = Replace(PathEncode, "%5F", "_")
    End Function

    Function IsHidden(File)
    IsHidden = File.Attributes And 2 = 2
    End Function

    笔记
  • 使用 <div class="folder">将 CSS 样式(即粗体等)应用于文件夹名称。
  • 该函数不会输出隐藏文件或目录。
  • relativePath参数用于保持尽可能低的工作量——当一个文件夹有 1000 个文件时,计算整个相对路径 1000 次是没有意义的。借助该参数,只处理实际发生变化的部分。
  • 具有 Say() 等功能或 h()周围可以为您节省大量的输入,它也使代码更干净。
  • 您应该阅读 URL 编码(以及 HTML 编码)。好像你从来没有遇到过这些东西,如果您的任务是构建安全站点,这尤其糟糕 .
  • 关于asp-classic - 列出经典 ASP 中的文件夹结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6506891/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com