Asp classic 在经典ASP中列出文件夹结构

Asp classic 在经典ASP中列出文件夹结构,asp-classic,Asp Classic,我已经为我工作的公司开发了一个ASP安全页面。有一个登陆(登录页面),一旦您通过身份验证,您将被带到一个包含多个子页面链接的页面。每个子页都有一个文件夹结构。例如:有一个会议纪要的标题,下面是引用PDF的链接,其中包含信息。可能有3或4个标题与下面链接的文档 原始版本有一个运行的PHP脚本,它将从一个文件夹结构同步服务器上的实时站点,该文件夹结构将被模拟到实时站点上。因此,如果我有一个名为Folder1的文件夹和名为test1 test2 test3的子文件夹。。实时站点将相应地显示它们。因为该

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

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

我在网上找到了一个代码片段,它在某种程度上符合我想要实现的目标(即文件夹/子文件夹/文件名结构),但我目前仍无法理解如何链接文件,以便在单击时打开它们。我一直在文件名中看到%25。我知道%20与空白相同,因为我处理的文件和文件夹名称中包含空格,这似乎是我的问题。我尝试添加%20,但空格变为“%2520”

如果你看下面的代码,有一个指向底部的链接称为“MapURL”。当我试图找出%25的来源时,我已经对该链接进行了注释。 有人对如何让链接工作有什么想法吗

下面是片段

dim路径
path=“服务器上文件夹的路径”
ListFolderContents(路径)
子列表文件夹内容(路径)
dim fs、文件夹、文件、项目、url
设置fs=CreateObject(“Scripting.FileSystemObject”)
set folder=fs.GetFolder(路径)
'显示目标文件夹和信息。
Response.Write(“
    ”&folder.Name&“)”——“_ “&folder.Files.Count&”Files“) '如果folder.SubFolders.Count>0,则 'Response.Write(folder.SubFolders.Count&“directories,”) "完" 'Response.Write(四舍五入(folder.Size/1024)和'KB总计'_ “&”
“&vbCrLf) 响应。写入(“
    ”&vbCrLf) '显示子文件夹列表。 对于folder.SubFolders中的每个项目 ListFolderContents(项目) 下一个 '显示文件列表。 对于文件夹.Files中的每个项目 'url=MapURL(item.path) '响应。写入(“
  • -”_ 回答。写(“
  • -”_ &项目名称&“”_ &“
  • ”&vbCrLf) 下一个 响应。写入(“
”&vbCrLf) 响应。写入(“”&vbCrLf) 端接头 函数映射URL(路径) dim根路径,url '将物理文件路径转换为超文本链接的URL。 rootPath=Server.MapPath(“/”) url=Right(路径,Len(路径)-Len(根路径)) MapURL=Replace(url“\”,“/”) 端函数
您可能需要在href(“”)处加上引号。最好的方法是查看生成的源代码(从结果页面),如


基本上,如果您只使用一个引号,它只会关闭字符串,但是您缺少href=之后所需的HTML引号和关闭的引号。

您的代码有几处错误

  • 首先也是最重要的是,您根本没有对输出的值进行编码。这是一个很大的错误。对于进入HREF属性的内容,您缺少URL编码,而对于其他内容,您缺少HTML编码
  • 接下来,每次调用递归的
    ListFolderContents()
    函数,都会创建一个新的
    FileSystemObject
    。这会造成不必要的浪费,而且一旦要输出的文件超过几个,速度就会变慢
  • 递归函数应该将
    文件夹
    对象作为第一个参数,而不是路径。这会使事情变得容易得多
  • 您输出的HTML结构无效。
    不能合法地成为
    的子级
我完全重写了您的代码,以产生更正确的输出并尽可能快。您的问题的关键是
pathcode()
函数,它将相对路径转换为正确编码的URL。其他事情应该是不言自明的:

ListFolder“P:\ATH\TO\THE\FOLDER\ON\THE\SERVER”
--主要职能----------------------------------------------------
子列表文件夹(路径)
根路径
设置fs=CreateObject(“Scripting.FileSystemObject”)
rootPath=Replace(路径,Server.MapPath(“/”),“&\”
ListFolderContents fs.GetFolder(路径),PathEncode(根路径)
端接头
' ----------------------------------------------------------------------
子列表FolderContents(文件夹,相对路径)
弱智儿童
说“
    ” 说“
  • ”&h(文件夹名称)&” 对于folder.SubFolders中的每个子文件夹 如果不是孩子,那么 ListFolderContents子级、relativePath和PathEncode(child.Name)和“/” 如果结束 下一个 相对路径=h(相对路径) 对于文件夹.Files中的每个子级 如果不是孩子,那么 说“
  • ” 如果结束 下一个 说“
” 端接头 “--助手功能/速记--------------------------------------- 附属法例(s) 响应。编写s&vbNewLine 端接头 功能h(s) h=服务器.HTMLEncode 端函数 函数路径编码 '这将创建一个更正确的Server.URLEncode变体 路径编码=替换(s,“\”,“/”) PathEncode=Server.URLEncode(PathEncode) 路径编码=替换(路径编码,“+”,“%20”) PathEncode=替换(PathEncode,“%2F”,“/”) PathEncode=替换(PathEncode,“%2E”,“) PathEncode=Replace(PathEncode,“%5F”和“389;”) 端函数 函数IsHidden(文件) IsHidden=File.Attributes和2=2 端函数
注释

  • 使用
    将CSS样式(即粗体等)应用于文件夹名称
  • 该函数不会输出隐藏的文件或目录
  • relativePath
    参数用于在折叠时尽可能降低工作负载