ASP Folder
Folder 对象的属性、子项遍历、创建删除与大小统计。
属性
| Property | Meaning |
|---|---|
Name | 不含路径 |
Path | 物理路径 |
Size | 含所有子目录,字节 |
Files | 直接子文件 |
SubFolders | 直接子目录 |
Files.Count | |
DateCreated | |
IsRootFolder | 盘符根目录为 True |
ParentFolder |
列出目录内容
<%
Dim fso, folder, item
Set fso = Server.CreateObject("Scripting.FileSystemObject")
Set folder = fso.GetFolder(Server.MapPath("/uploads"))
Response.Write "<h3>共 " & folder.Files.Count & " 个文件</h3>"
Response.Write "<table border=""1"">"
Response.Write "<tr><th>文件名</th><th>大小</th><th>修改时间</th></tr>"
For Each item In folder.Files
Response.Write "<tr><td>" & Server.HTMLEncode(item.Name) & "</td><td>" & _
FormatNumber(item.Size / 1024, 1) & " KB</td><td>" & _
item.DateLastModified & "</td></tr>"
Next
Response.Write "</table>"
%>共 2 个文件
文件名 大小 修改时间
report.pdf 180.0 KB 2026/11/2 17:40:55
notes.txt 1.0 KB 2026/11/3 9:02:11递归统计大小
<%
Function DirSize(folder)
Dim f, sub_, total
total = 0
For Each f In folder.Files
total = total + f.Size
Next
For Each sub_ In folder.SubFolders
total = total + DirSize(sub_)
Next
DirSize = total
End Function
Response.Write FormatNumber(DirSize(folder) / 1048576, 2) & " MB"
%>12.48 MBfolder.Size already includes subdirectories, so recursion is usually unnecessary. On huge trees Size walks everything at once — slow and heavy — while your own recursion can report progress or skip directories.
创建与删除
<%
' 创建(父目录必须存在)
If Not fso.FolderExists(Server.MapPath("/logs/2026")) Then
fso.CreateFolder Server.MapPath("/logs/2026")
End If
' 删除(True = 连同内容一起删)
fso.DeleteFolder Server.MapPath("/logs/2026"), True
' 复制与移动
folder.Copy Server.MapPath("/backup/uploads"), True
folder.Move Server.MapPath("/archive/uploads")
%>CreateFolder does not create intermediate parents: making /a/b/c when /a/b is missing raises an error. Create each level yourself, or create the parent first.
遍历子目录
<%
Dim sub_, depth
Sub ShowTree(f, depth)
Response.Write String(depth * 2, " ") & "📁 " & f.Name & "<br>"
Dim s
For Each s In f.SubFolders
ShowTree s, depth + 1
Next
End Sub
ShowTree folder, 0
%>📁 uploads
📁 2025
📁 10
📁 2026
📁 11删除目录的安全问题
<%
' 危险:目录名来自参数
fso.DeleteFolder Server.MapPath(Request("dir")), True
' 安全:固定父目录 + 名称白名单
Dim name
name = Request("dir")
If name Like "[A-Za-z0-9_-]*" And InStr(name, "..") = 0 Then
fso.DeleteFolder Server.MapPath("/uploads/" & name), True
End If
%>DeleteFolder with True deletes recursively. Any user influence over the path requires strict validation — a ../../ input can wipe the whole site.
属性
| 属性 | 含义 |
|---|---|
| 目录名 | 不含路径 |
| 完整路径 | 物理路径 |
| 总大小 | 含所有子目录,字节 |
| 文件集合 | 直接子文件 |
| 子目录集合 | 直接子目录 |
| 文件数 | |
| 创建时间 | |
| 是否根 | 盘符根目录为 True |
| 父目录 |
列出目录内容
<%
Dim fso, folder, item
Set fso = Server.CreateObject("Scripting.FileSystemObject")
Set folder = fso.GetFolder(Server.MapPath("/uploads"))
Response.Write "<h3>共 " & folder.Files.Count & " 个文件</h3>"
Response.Write "<table border=""1"">"
Response.Write "<tr><th>文件名</th><th>大小</th><th>修改时间</th></tr>"
For Each item In folder.Files
Response.Write "<tr><td>" & Server.HTMLEncode(item.Name) & "</td><td>" & _
FormatNumber(item.Size / 1024, 1) & " KB</td><td>" & _
item.DateLastModified & "</td></tr>"
Next
Response.Write "</table>"
%>共 2 个文件
文件名 大小 修改时间
report.pdf 180.0 KB 2026/11/2 17:40:55
notes.txt 1.0 KB 2026/11/3 9:02:11递归统计大小
<%
Function DirSize(folder)
Dim f, sub_, total
total = 0
For Each f In folder.Files
total = total + f.Size
Next
For Each sub_ In folder.SubFolders
total = total + DirSize(sub_)
Next
DirSize = total
End Function
Response.Write FormatNumber(DirSize(folder) / 1048576, 2) & " MB"
%>12.48 MBfolder.Size 已经包含所有子目录,一般不需要自己递归。但目录极大时 Size 会遍历整个树,慢且占资源;自己递归能做进度提示或跳过某些目录。
创建与删除
<%
' 创建(父目录必须存在)
If Not fso.FolderExists(Server.MapPath("/logs/2026")) Then
fso.CreateFolder Server.MapPath("/logs/2026")
End If
' 删除(True = 连同内容一起删)
fso.DeleteFolder Server.MapPath("/logs/2026"), True
' 复制与移动
folder.Copy Server.MapPath("/backup/uploads"), True
folder.Move Server.MapPath("/archive/uploads")
%>CreateFolder 不会自动创建多级父目录。要建 /a/b/c 而 /a/b 不存在时会报错——需要自己逐级判断创建,或者先 CreateFolder 父级。
遍历子目录
<%
Dim sub_, depth
Sub ShowTree(f, depth)
Response.Write String(depth * 2, " ") & "📁 " & f.Name & "<br>"
Dim s
For Each s In f.SubFolders
ShowTree s, depth + 1
Next
End Sub
ShowTree folder, 0
%>📁 uploads
📁 2025
📁 10
📁 2026
📁 11删除目录的安全问题
<%
' 危险:目录名来自参数
fso.DeleteFolder Server.MapPath(Request("dir")), True
' 安全:固定父目录 + 名称白名单
Dim name
name = Request("dir")
If name Like "[A-Za-z0-9_-]*" And InStr(name, "..") = 0 Then
fso.DeleteFolder Server.MapPath("/uploads/" & name), True
End If
%>DeleteFolder 带 True 会递归删掉一切。路径只要能被用户影响,就必须严格校验——../../ 这样的输入能删掉整个站点。