📄 0048.htm
字号:
<br>
第二个方法是建立一个允许账号为 IUSER_机器名 的用户读写的目录。但这样可能会带来安全漏洞。如果这个目录让黑客知道了,就可以往里面写一些代码并通过某种方式运行它,那你就惨了。所以最好将这个目录建立在Web路径之外(也就是inetpub路径之外)。<br>
<br>
<br>
<br>
用FSO实现search功能<br>
<br>
现在让我们来做更进一步的工作,用FSO在我们的Web站点上实现search功能。建立搜索引擎的关键是递归。<br>
<br>
首先来建立搜索页面。假设我们已经给用户提供了一个输入搜索字符串的页面。<br>
<br>
Dim objFolder<br>
Dim strSearchText<br>
Dim objFSO<br>
<br>
strSearchText = Request.Form("SearchText") <-- 搜索字符串<br>
<br>
' 建立 FSO 和文件夹对象<br>
Set fso = Server.CreateObject("Scripting.FileSystemObject")<br>
Set objFolder = objFSO.GetFolder(Server.MapPath("/"))<br>
<br>
Search objFolder<br>
<br>
上面的代码只是进行了一些变量初始化工作,真正的serach工作由下面这个Search函数执行。<br>
<br>
Function Search(objFolder)<br>
Dim objSubFolder<br>
<br>
'循环搜寻当前文件夹中的每个文件<br>
For Each objFile in objFolder.Files<br>
<br>
Set objTextStream = objFSO.OpenTextFile(objFile.Path,1) <-- For Reading<br>
<br>
'把文件内容读入一个变量<br>
strFileContents = objTextStream.ReadAll<br>
<br>
'如果在文件中找到该字符串,写个指到该文件的链接<br>
If InStr(1, strFileContents, strSearchText, 1) then<br>
Response.Write "<A HREF=""/" & objFile.Name &""">" & objFile.Name & "</A><BR>"<br>
bolFileFound = True<br>
End If<br>
<br>
objTextStream.Close<br>
<br>
Next<br>
<br>
'以下是递归部分<br>
' 如果其中有子目录,再调用Search函数<br>
For Each objSubFolder in objFolder.SubFolders<br>
Search objSubFolder<br>
Next<br>
<br>
End Function<br>
<br>
该程序会自动搜索Web root目录以下的所有子目录,还不错吧?<br>
<br>
(FSO要使用物理绝对路径,而不是Web Path的相对路径。例如,要打开的是c:\inetpub\wwwroot\temp\index.html,而不能是www.enfused.com/temp/index.html 或 /temp/index.html。要将后一种路径转换为物理绝对路径,使用Server.MapPath("filename")。)<br>
<br>
随着文件和子目录数的增加,程序运行的时间会变长。所以如果是要提供繁重的搜寻功能,还是建议使用象 Microsoft Index Server这样的专业工具。<br>
<br>
<br>
<br>
用FSO进行目录管理<br>
<br>
现在知道FSO的好处了吧?下面我们尝试用FSO来做更复杂一些的工作。<br>
<br>
Web目录管理就是在Web环境下进行文档的新建删除改名移动等工作,一个好的Web目录管理工具可以为用户提供一个与我们惯用的环境一样的操作方法来管理Web服务器上的文件。<br>
<br>
那么先让我们来试试文件改名。首先要告诉大家,不幸得很,FSO不允许直接文件改名,所以我们要绕个弯进行。<br>
<br>
<%<br>
' 建立fso对象<br>
set fso = Server.Createobject("Scripting.FileSystemObject")<br>
<br>
path = "c:\temp\test.txt"<br>
strDate = Replace(Date(), "/", "")<br>
strDir = "c:\inetpub\wwwroot\articles\" & strDate<br>
<br>
strNewFileName = Hour(Now) & "_" & Minute(Now) & "_" &second(Now) & ".html"<br>
<br>
' 打开旧文件<br>
set file = fso.opentextfile(path, 1) <-- 用于读<br>
strText = file.readall<br>
set file = nothing<br>
<br>
' 检查是是否要建立文件夹<br>
if not fso.folderexists(Server.MapPath(strDir)) then<br>
set f = fso.CreateFolder(Server.MapPath(strDir))<br>
else<br>
set f = fso.GetFolder(Server.MapPath(strDir))<br>
end if<br>
<br>
' 创建并写入新文件<br>
set file = fso.Createtextfile(f.path & "\" & strNewFileName)<br>
file.write(strText)<br>
<br>
set f = nothing<br>
file.close<br>
set file = nothing<br>
<br>
' 删除旧文件<br>
fso.DeleteFile(path & "\" & rst("FileName") & i)<br>
<br>
' 清除<br>
set fso = nothing<br>
%><br>
<br>
我们在这里特别举这个例子就是因为FSO在这个功能上存在缺陷,所以我们必须分两步走。首先新建一个文件,注意,由于用户可能将文件改名到另一个目录下,所以我们必须判断新目录是否存在(就是if not fso.folderexists那段代码)。新文件建好后,用fso.DeleteFile 将旧文件删除。<br>
<br>
<br>
<br>
FSO功能上的弱点<br>
<br>
FSO还是存在一些弱点。例如,它在处理二进制文件的时候就不那么方便。对于象MS Word文档,图像等许多文件,你只能执行移动,删除等操作,而不能打开,读/写。当然,FSO提供了另外一套操作它们的方法(具体请参考MSDN),但始终不如我们惯用的open方法那么顺手。<br>
<br>
另一个不足与文件大小有关。由于FSO操作需要经常地将文件内容读入内存,文件有多大,就需要多少内存,所以如果你要处理大文件或一大堆小文件的话,内存的开销会很可观,可能会对系统运行速度有影响。解决办法是将大文件分段处理,并记住经常地清除内存(把变量设为null或"",set 对象=nothing)。<br>
<br>
此外,FSO不能改变文件和文件夹的属性。例如,在建立guestbook的例子中,其实有一个安全机制我们没有实现,就是将保存信息的文件的属性设为只读,只有在更新的时候才临时改为可写,写完后再改回只读,许多用CGI或Perl写的guestbook程序都有这种功能,可惜用FSO无法实现该功能。<br>
<br>
<br>
<br>
FSO还能干些什么?<br>
<br>
总的来说,FSO还是很强大的。FSO还有一些一般没人注意到的很酷的功能。下面列出一些,当你看完可能会说“呀,我以前怎么不知道。”呵呵。<br>
<br>
GetSpecialFolder 方法<br>
返回一个特殊的Windows文件目录:Windows安装文件目录,系统文件目录,临时文件目录。使用方法分别是:FSO.GetSpecialFolder([0, 1, or 2]) <br>
<br>
GetTempName 方法<br>
返回一个随机生成的临时文件或文件夹。象处理上面所说的将大文件分割处理的时候这个功能特别有用。(讨饭猫:如果Win98常死机的话,我们经常可以在Windows根目录下看到大量的长度为0的随机文件名,估计就是这个用途)<br>
<br>
GetAbsolutePathName 方法<br>
返回一个文件夹的绝对路径(有点象Server.MapPath)。例如,FSO.GetAbsolutePathName("region")会返回象"c:\mydocs\myfolder\region" 这样的路径,具体取决于你的当前目录。<br>
<br>
GetExtensionName 方法<br>
返回文件的扩展名。例如 FSO.GetExtensionName("c:\docs\test.txt") 返回 "txt"。<br>
<br>
GetBaseName 和 GetParentFolder 方法<br>
分别返回根目录名和父目录名。例如 FSO.GetParentFolder ("c:\docs\mydocs") 返回 "docs"。<br>
<br>
Drives 属性<br>
返回本机上所有驱动器的集合。如果你要建立一个explorer风格的界面,这个功能再有用不过。<br>
<br>
记住要建立一套完善的错误信息处理机制,因为上面这些功能如果遇到象文件夹不存在之类错误时,会返回一些可恶的错误代码。<br>
<br>
看到这里,是不是觉得FSO有用呢?实际上,我们所提到的内容只是冰山的一角。在Enfused等大站点上,还可以看到更多与此有关话题的讨论。<br>
<br>
Copyright 1999-2000 internet.com Corp. All RIGHTS RESERVED.<br>
</table>
<p align="center"><script src="../../2.js"></script></a>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -