大家可以感觉到,与 ASP 相比此类 CGI 程序的可读性和易操作性都较差。那么你一定想问 ASP 是否也能直接在服务器上写文件呢?答案当然是肯定的。但是聪明的朋友可能会想到,既然 ASP 同 WEB 数据库的连接如此便捷,我们又何需再将客户信息写在文本文件中呢, ASP 的这个功能岂不是画蛇添足?的确,对于那些我们常见的留言簿、 BBS 等 WEB 应用程序而言,无论是在程序的执行效率还是易用性上,我们都不可能再用写文本文件来替代数据库,但是在某些 WEB 应用领域里写文本文件既是一种规范也是一种相对数据库而较便捷的方法。如果你对 NT 较熟悉的话,你一定知道 NT 具有非常强大的安全机制,它可以将几乎所有的服务器操作和连接的信息自动保存在一个后缀名为 .log 的文件中,其实这种技术也完全可以被运用在 WEB 上,用来记录一些的客户登陆信息。下面的这段程序正是利用 ASP 读写文本文件的特性,在一个 WEB BBS 程序中创建自动记录每个用户发言记录的功能。
< %
Set fs = CreateObject("Scripting.FileSystemObject")
ForReading = 1
'以只读模式打开文件。不能对此文件进行写操作。
ForAppending = 8
'打开文件并在文件末尾进行写操作。
TristateUseDefault = -2
TristateTrue = -1
TristateFalse = 0
'-----------写入系统log开始--------
servermap=server.MapPath("\bbs\log\")
'映射系统物理路径
temp=servermap&"\"&year(date)&month(date)&"\"
'获取系统物理路径和时间,并以此作为log文件存放的物理路径
if Not fs.FolderExists(temp) then
fs.CreateFolder(temp)
end if
'检测是否存在文件夹,否则自动创建
dim syslog
dim tempname
tempname=date
syslog=temp&tempname&".log"
'文件名为e:\bbs\log\月份\月日.log
li=user&"&"&Now&"&"&Request.ServerVariables("REMOTE_ADDR")&"&"&tempfile&"&"&letter&"&"&title
'log文件记录的格式为:用户名&发信时间&用户ip&文件路径&信区&信件标题
if fs.FileExists(syslog) then
Set ss = fs.OpenTextFile(syslog,ForAppending,true)
else
set ss = fs.CreateTextFile(syslog,ForWriting,false)
end if
'检测log文件是否存在,如果存在则追加文件内容,反之则直接写文件
ss.WriteLine(li)
ss.Close
'-----------log文件写入结束---------
%>
如果你没有完全看懂上面的这段程序,就请听作者慢慢道来。 File Access 组件提供了可用来访问计算机文件系统的方法和属性。我们可以使用 File Access 组件创建 FileSystemObject 对象,以上程序的第一句就是利用 File Access 组件创建了一个名为 fs 的对象实例。在对象被创建后,你可以通过它访问文件,该对象没有属性,它唯一的意义就是创建、打开或读写文本文件。 FileSystemObject 对象有两种最常用的方法,一种用来创建文件,另一种是用来打开并读写文本文件。 CreateTextFile 方法获得你指定的文件名并创建该文件,它返回一个 TextStream 对象,你可以用该对象在文件被创建后操作该文件, CreateTextFile 方法的语法如下 :
Set objTextStream=FileSystemObject.CreateTextFile(Filename,[Overwrite],[Unicode])
下面作者给大家解释一下 CreateTextFile 方法的参数
1、 Filename 包含文件路径名的字符串,可以是文件的全路径名,包括驱动器名和目录名,或者也可以只是文件名,如果只包含文件名的话,文件将被创建在站点的根目录下。
2、 Overwrite 布尔量,设置成 False 时可以防止 FileSystemObject 对象在创建一个新文件时删除已存在的文件,该参数是可选的,如果没有赋值系统默认为 true,具有相同文件名的已有文件会被删掉。
3、 Unicode 可选参数。布尔值指明是否以 Unicode 或 ASCII 文件格式创建文件。如果以 Unicode 文件格式创建文件,则该值为 True;如果以 ASCII 文件格式创建文件,则该值为 False。如果省略此部分,则假定创建 ASCII 文件。
在前面的程序中我们用 set ss=fs.CreateTextFile(syslog,ForWriting,false) 来在 log 文件不存在的情况下创建文件并对文件进行写操作,这里的“ForWriting”表示写文件。
与 CreateTextFile 方法不同, OpenTextFile 方法用来获得你指定的文件名并打开该文件,利用它所带的参数我们可以对文件进行各种不同的操作,和 CreateTextFile 方法一样, OpenTextFile 方法返回一个 TextStream 对象,使得你可以在文件被打开后操作该文件。 OpenTextFile 方法的语法如下 :
Set objTextStream=FileSystemObject.OpenTextFile(Filename,[IOmode],[Create],[Format])
参数说明如下 :
1、 Filename 必须的变量,同 CreateTextFile 的 filename
2、 IOmode 可选的常量,取值为下列两个常数之一 ForReading 或 ForAppending,如果 mode 为 1,文件以只读方式打开,如果为 8,则文件以追加的方式打开。
3、 Create 可选的布尔量,指定如果你想打开的文件不存在是做什么操作,如果其值为 True,当文件不存在时就自动创建一个空的文件。如果为 False,就会在文件没找到时产生一个出错信息,其默认值是 False,建议将其设为 True,以避免在打开文件时检查是否出错。
4、 Format 可选值,可以选择三种 Tristate 值分别指定文件的格式, -2、 -1、和 0 分别对应于系统缺省、 unicode 和 ASCII。
在打开或创建了文本文件后,就得到一个 TextStream 对象,该对象有一个光标,就好象是在字处理程序中的光标一样,指出接下来要敲入的字符将出现的位置,它同时也指出你要读取的字符的位置。不能通过 CreatObject 来创建一个 TextStream 对象,得到 TextStream 对象的唯一方法是如前所述的用 FileSystemObject 对象打开一个存在的文本文件或者创建一个新的文件。
下面列出了 TextStream 对象的属性和方法
TextStream.AtEndOfLine 只读布尔量,当光标在当前行的末尾时,其值为 true,反之则为 false
TextStream.AtEndOfStream 只读布尔量,如果光标在流的末尾时,其值为 true,否则为 false
TextStream.Column 只读的整数,统计从行首到当前光标位置之间的字符数
TextStream.Line 只读的整数,指明光标所在行在整个文件中的行号
TextStream.close() 关闭流以及对应的文本文件
TextStream.read(Num) 指定从光标的当前位置开始从文本文件中读取一定数目的字符
TextStream.readall() 将整个流读入一个字符串中
TextStream.readline() 将一整行的字符读入一个字符串中
TextStream.write(text) 将一个字符串写入流中
TextStream.writeline() 将一个文本串写入流中
TextStream.skip(Num) 在流中,将光标的位置移动一定数目的字符串长度
TextStream.skiplines() 在流中,将光标移动一定数目的行数
TextStream.writeblank 将一定数目的空行写入流中
lines(num)
相信大家现在已经可以感觉到 ASP File Access 组件的强大功能了,其实它远不仅仅可以写一些 log 文件,通过它你甚至可以毫不费力的远程自动更新你的网站,你只要把固定格式的文本文件传送到远端的服务器上,通过 File Access 组件读取文件,并自动生成全新 HTML 页面即可,而不必再辛辛苦苦地一个一个地更新 HTML 文件。如果你有兴趣,你完全可以用 ASP 的 File Access 组件写一个自己的全自动 HTML 生成器,充分享受维护网站的超前轻松感。
这个网页上有教程
http://chinese.pku.edu.cn/netstudy/aspteach/index.asp