在ASP中FSO的意思是File System Object即文件系统对象
我们将要操纵的计算机文件系统在这里是指位于web服务器之上所以确认你对此拥有合适的权限理想情况下你可以在自己的机器上建立一个web服务器这样就能方便地进行测试如果运行于Windows平台请试一试微软公司的免费个人Web服务器PWS
FSO 模型对象
Drive Object驱动器对象 供存取磁盘或者网络驱动器
FileSystemObject Object文件系统对象 供存取计算机的文件系统
Folder Object文件夹对象 供存取文件夹的所有属性
TextStream Object文本流对象 供存取文件内容
你可以使用上面的对象做计算机上的任何事情也包括破坏活动 ;( 所以请小心使用FSO在web环境中存储信息是非常重要的比如用户信息日志文件等等FSO提供了一个强大且简单的方法高效率地保存数据在这篇文章里面着重讨论FileSystemObject和TextStream对象
FSO由微软公司提供支持对于非Windows系统大概不能再使用ASP
怎么样使用FSO?
为了使用FSO来执行所有的工作首先要创建对象代码就象下面这样
< % Set fso = ServerCreateObject("ScriptingFileSystemObject")
% >
这样就建立了FSO并且赋予变量fso接着就可以使用熟悉的objectmethod语法来执行文件系统的操作〔查看Visual Basic文档获取更多的关于对象和对象向导编程的知识〕在这里我们可以使用fsomethod 或者 fsoproperty这些将在下面的例子中看到
FSO模型位于由微软提供的脚本运行时间DLL文件中它是scrrundll你可以在任何应用程序中引用这个DLL文件比如MS AccessWord 就是说并非仅仅限制在ASP中应用它
这里有一个简要的FSO方法列表
FSO方法 CopyFile 拷贝一个或者多个文件到新路径 CreateTextFile 创建文件并且返回一个TextStream对象 DeleteFile 删除一个文件 OpenTextFile 打开文件并且返回TextStream对象以便读取或者追加
如果想了解完整的FSO方法与属性请查阅微软MSDN下面来看几个例子
假设你想创建一个简单的留言簿你可以建立一个数据库在其中存储用户的信息然而如果并不需要数据库的强大功能使用FSO来存储信息将节省你的时间和金钱并且一些ISP也许限制了web上的数据库应用
假设你在一个表单中收集了一些用户信息这里是一个简单表单HTML代码
< html>
< body>
< form action="formhandlerasp" method="post">
< input type="text" size="" name="username">
< input type="text" size="" name="homepage">
< input type="text" size="" name="Email">
< /form>
< /body>
< /html>
再看看formhandlerasp中处理表单的代码
< %
Get form info
strName = RequestForm("username")
strHomePage = RequestForm("homepage")
strEmail = RequestForm("Email")
create the fso object
Set fso = ServerCreateObject("ScriptingFileSystemObject")
迄今为止还没有新鲜的东西无非是获取表单域的值并且赋值到变量下面出现了有趣的部分 - 写文件
path = "c: emp esttxt"
ForReading = ForWriting = ForAppending =
open the file
set file = fsoopentextfile(path ForAppending TRUE)
write the info to the file
filewrite(strName) & vbcrlf
filewrite(strHomePage) & vbcrlf
filewrite(strEmail) & vbcrlf
close and clean up
fileclose
set file = nothing
set fso = nothing
回想一下OpenTextFile方法返回一个TextStream对象它是FSO模型中的另外一个对象TextStream对象揭示了操作文件内容的方法比如写读一行跳过一行VB常量vbcrlf产生一个换行符
在OpentextFile的命令参数中定义了TRUE这就告诉了系统如果文件不存在就创建它如果文件不存在并且没有定义TRUE参数就会出错
现在转到目录c: emp打开testtxt你可以看到如下的信息
Users name
Users home page
Users email
当然这些单词可以被输入在表单中的任何内容所替换
现在已经有了一些用户信息保存在文件中就像一个简单的数据库假设有一个用户想了解所有的访问者就要从登记的信息中分离出相关部分因为没有象数据库一样拥有结构化的列
我们知道在所创建的文件中第行是用户名第行是他们的主页第行是他们的电子邮件地址随后登记的用户也是按照这样的结构存储他们的信息所以每行将包含一个用户的登记信息知道了这些就可以编写下面的代码来显示信息
< %
create the fso object
set fso = ServerCreateobject("ScriptingFileSystemObject")
path = "c: emp esttxt"
open the file
set file = fsoopentextfile(path ) < For
reading
接着分析每一行并且格式化数据
do until fileAtEndOfStream
Responsewrite("Name: " & fileReadLine & " ")
Responsewrite("Home Page: " & fileReadLine & " ")
Responsewrite("Email: " & fileReadLine & "< p>")
loop
close and clean up
fileclose
set file = nothing
set fso = nothing
%>
这里仅仅做了一个非常简单的输出但是你可以根据情况包含表格或者DHTML表单信息
如果已经正确地建立并写入了文件上面的小小循环将合适地列出数据库中的每一个人的信息ReadLine方法读取行内容直到遇到换行符随后的ReadLine调用将读取下一行AtEndOfStream是TextStream对象的属性它告诉我们何时遇到文件的尾部
假设由于某种原因我们没有正确地形成文件如果一个用户只有行信息而不是行那么就会产生一些错误我们这里的循环取回文件中的下行信息如果没有行多的信息就将出现如下的错误信息
Server object error ASP : ae
所以一定要添加一些错误处理代码以防文件中插入了多余的行或者少了必要的行信息
上面讨论了基本知识然后说说权限许可的问题FSO以创建它的用户帐户权限运行换言之如果有人从Internet上访问你的页面那么这个internet帐户就创建FSO如果以administrator的身份登录计算机并且登录页面那么administrator帐户就创建了FSO这是非常重要的因为一定的帐户拥有一定的权限并且FSO需要一些权限从而能完整的执行功能
internet帐户(IUSER_MachineNameMachineName是服务器的名字)一般只拥有读权限这意味着用户将不能写入留言簿文件然而有几个选择可以绕过这个问题
首先也是很困难的是要求用户在填写留言簿前登录到服务器然而留言簿的要点是从匿名用户处收集信息如果要求用户登录就必须要知道他们是谁因此跳过这个选择看下一个
第个方法是创建一个目录或者文件IUSER_MachineName用户对此有写权限这样做可能开放了一些潜在的安全漏洞因为任何知道正确目录并具备一定web技巧的人就能在服务器上填充内容这是一个很严重的禁忌所以你必须确认在隐藏的场所保存了这些可写目录的信息并且尽可能地将这些目录设置在web目录结构以外(比如在Windows下这是一个不在inetpub目录下的一个目录)
你也许想好现在我知道如何写入文件了但能做到更多一些吗?下面来试一试为web站点建立一个搜索功能
建立搜索引擎的关键是递归主要地编写一段代码搜索目录下的文件然后对所有的目录循环执行同样的代码因为不能确定总共有多少个子目录所以必须一遍又一遍地执行搜索代码直到结束递归调用非常好!
下面来创建搜索页面假设已经建立了一个HTML表单用户在其中输入一个搜索字符串
Dim objFolder
Dim strSearchText
Dim objFSO
strSearchText = RequestForm("SearchText") < The search string
create the FSO and Folder objects
Set fso = ServerCreateObject("ScriptingFileSystemObject")
Set objFolder = objFSOGetFolder(ServerMapPath("/"))
Search objFolder
上面的代码简单地初始化变量Search函数执行搜索功能描述如下
Function Search(objFolder)
Dim objSubFolder
loop through every file in the current
folder
For Each objFile in objFolderFiles
Set objTextStream = objFSOOpenTextFile(objFilePath) < For Reading
read the files contents into a
variable
strFileContents = objTextStreamReadAll
if the search string is in the file then
write a link
to the file
If InStr( strFileContents strSearchText ) then
ResponseWrite "< A HREF=""/" & objFileName & _
""">" & objFileName & "< /A>< BR>"
bolFileFound = True
End If
objTextStreamClose
Next
Heres the recursion part for each
subfolder in this directory run the Search function again
For Each objSubFolder in objFolderSubFolders
Search objSubFolder
Next
End Function
为了能打开文件FSO需要实际的文件路径而不是web路径比如是c:inetpubwwwroot empindexhtml 而不是wwwenfusedcom/temp/indexhtml 或者 /temp/indexhtml 为了将后者转换为前者使用ServerMapPath("filename") filename表示web路径名
上面的代码将在你指定的初始目录下的文件夹的每一个子目录中执行在这里初始目录是指web根目录“/”然后就简单地打开目录下的每一个文件看看其中是否包含指定的字符串如果找到字符串就显示那个文件的链接
注意随着文件和子目录数量的增加搜索花费的时间也将增加如果需要繁重的搜索工作建议你采取其他的方法比如微软公司的索引服务器Index Server
到此你对FSO可能已经有了很好的体会让我们再深入研究一步来解决更复杂的难题
首先你可能希望对文件改名为了跟蹤所有的文档你将要重新命名它们以便唯一这样就可以被系统容易地区别很不幸FSO不允许简单的文件改名操作所以我们不得不修改一下
< %
create the fso object
set fso = ServerCreateobject("ScriptingFileSystemObject")
path = "c: emp esttxt"
strDate = Replace(Date() "/" "")
strDir = "c:inetpubwwwrootarticles" & strDate
strNewFileName = Hour(Now) & "_" & Minute(Now) & "_" &
second(Now) & "html"
open the old file
set file = fsoopentextfile(path ) < For reading
strText = filereadall
set file = nothing
check for and/or create folder
if not fsofolderexists(ServerMapPath(strDir)) then
set f = fsoCreateFolder(ServerMapPath(strDir))
else
set f = fsoGetFolder(ServerMapPath(strDir))
end if
create and write new file
set file = fsoCreatetextfile(fpath & "" & strNewFileName)
filewrite(strText)
set f = nothing
fileclose
set file = nothing
delete the old file
fsoDeleteFile(path & "" & rst("FileName") & i)
clean up
set fso = nothing
%>
FSO能力的不足在这里却成了优势我们可以一次执行步首先打开文件并读入文件的内容假设这里要创建一个唯一的文件夹和一个唯一的文件来存储文章然而因为文件夹的路径每天都将改变所以必须首先检查是否文件夹已经存在如果不存在就创建它这在if not fsofolderexists代码段完成然后取得那个路径创建一个新的文件新文件建立完成后删除掉旧文件这通过fsoDeleteFile来完成
这步就是对文件改名然后移动到一个更合适的目录下注意在这里还可以对文件进行更多地操作比如在写入新文件前进行一下内容的编辑
FSO确实存在一些弱点 - 比如它很难处理二进制文件这包括Word文档许多图形格式的文件和其他一些文件然而你仍然可以用其他的方式操作这些文件 - 移动它们删除它们等等你不能做的就是对它们进行打开或者写操作
另外一个限制是对于文件长度的问题当立刻读写一些内容时所有的信息都存储在内存中 - 内容越多消耗的内存就越大这将使每个工作都变得慢起来所以如果需要操作非常大的文件或者大量的小文件时考虑将文件分割成小块并且经常的清除内存将应用程序融入进COM对象组件也能大大地提高程序的速度
同样你也不能使用FSO来管理权限以及文件文件夹的属性执行安全加密的一个很好方法就是将前面提到的留言簿文件设置为只读在需要时再设置为可写然后再修改回来这个方法经常在CGI和Perl使用但是很不幸还没有令人满意的方法来用FSO实现
还能用FSO做什么?
在FSO中还有许多很棒的功能但许多人没有意识到这些功能常常是在你感到做某些事情很难后才发现的这时你经常要感歎到要是我早知道这个方法就好了!
下面列举一下这些不常用但是却非常酷的功能
很少被了解的FSO功能
GetSpecialFolder Method 返回特定的Windows文件夹的路径: Windows安装目录Windows系统目录Windows临时目录 FSOGetSpecialFolder([ or ]) GetTempName Method 返回一个随机产生的文件或者目录名字用于需要存储临时数据时GetAbsolutePathName Method 返回文件夹的绝对路径(类似于ServerMapPath)
比如FSOGetAbsolutePathName("region") 将返回类似于下面的结果"c:mydocsmyfolder egion"
GetExtensionName Method 返回路径中最后部分的扩展名(比如FSOGetExtensionName("c:docs esttxt") 将返回txt) GetBaseName and GetParentFolder Methods 返回路径中最后部分的父文件夹
(比如FSOGetParentFolder ("c:docsmydocs") 将返回docs) Drives Property 返回所有本地可用驱动器的集合用于建立资源浏览器样的用户接口
使用上面的功能时最好建立好出错处理的代码因为如果需要的参数不存在将会产生麻烦的信息
总结
如我们所见FSO非常有用这里介绍的仅仅是冰山一角你可以使用FSO建立功能强大的应用程序简单地完成许多任务