ASP的内置组件——文件系统组件
ASP的内置组件——文件系统组件
二、文件系统组件
在VBScript中,我们无法对系统的文件、磁盘进行操作,如果需要对文件或磁盘进行操作,需要借助于文件系统组件才能够实现。
文件系统组件提供了三个主要的对象:
1) Dictionary对象:用于通过对象的名字而不是其索引进行访问和引用。
2) FileSystemObject对象:用于对服务器底层文件系统的访问
3) TextStream对象:用于对储存在磁盘上的文件进行访问,用于同FileSystemObject对象协同使用。
FileSystemObject对象提供了三个对象的集合:Drivers、Folders和Files。它们用来进行磁盘上的驱动器、文件夹和文件的遍历、定位。
实际上,文件系统组件不是ASP所特有的服务器端对象,它们是通过scrrun.dll文件里的脚本运行期库完成的。当ASP采用了一种脚本语言时,这些对象总是可用的。一般的把Dictionary对象、FileSystemObject对象和TextStream对象称为脚本对象。
1.Dictionary对象
Dictionary对象在使用之前。需要将其实例化,语法如下:
Dim objMyData
Set objMyData = Server.CreateObject (“Scripting.Dictionary”)
或者
<Object Ruanat=Server Scope=“page” Id=“objMyData” ProgID=“Scripting.Dictionary”>
</Object>
1) Dictionary对象的方法与属性
Dictionary对象提供了一些方法、属性以便于对目录进行操作。
属性:
CompareMode : 设定或返回键的比较形式
Count : 只读属性,返回目录里的键或条目的数量
Iten(key) : 设定或返回指定键的条目值
Key(key) : 设定或返回指定键的值
方法:
Add(key,item) : 增加键/条目到Dictonary对象
Exists(key) : 指定的键的存在状态
Item() : 返回一个包含所有条目的数组
Key() : 返回一个包含所有键的数组
Remove(key) : 删除指定的键/条目对
RemoveAll() : 删除全部键/条目对
2)Dictionary对象示例
Dictionary对象类似于数组,但由于其本身具有的方法、属性,从而使其比数组具有更好的可操作性。
在ASP中,我们可以创建不同级别的数组,比如应用级、会话级等等。同样Dictionary对象也具有这样的特点,可以根据需要创建不同级别的Dictionary对象。
比如,可以创建一个应用级的Dictionary对象,存储产品信息。在Global.asa文件中的初始化代码如下:
<Script Runat=Server Language=VBScript>
Set myDic = Server.CreateObject(“Scripting.Dictionary”)
myDic.Add “25415”, “Something about yourself”
myDic.Add “45113”, “The long day”
myDic.Add “48948”, “Book for children”
myDic.Add “02100”, “Connect to dead”
Application(“myDic”) = myDic
</Script>
在其它页面中按如下方法引用:
<% Set myDic = Application(“myDic”)
For Each item in myDic
Response.Write item & “, “ & myDic(item”) — “<br>”
Next %>
注意这里的set关键字,Application(“myDic”)是一个对象,必须使用set关键字才能引用。
在网上商店(Shopping online)应用中,也可以将Dictionary对象作为顾客的购物栏,然后使用相应的方法进行操作。
2.FileSystemObject对象
FileSystemObject对象实例化语句如下:
Dim myFile
Set myFile = Server.CreateObject (“Scripting.FileSystemObject”)
或者
<Object Runat=Sever Scope=page id=myFile progid=”Scripting.FileSystemObject”>
</Object>
1)FileSystemObject对象的属性和方法
FileSystemObject对象提供了一个属性和大量的方法,可以使用这些方法来操纵FileSystemObject的从属对象。
属性:
Drivers : 返本地计算机可用的驱动器列表。,包括映射的网络驱动器
方法:
(1)与驱动器有关的方法:
DriveExists(drivespec) : 返回指定的驱动器是否存在
GetDrive(drivespec) : 返回指定的驱动器对应的Drive对象
GetDriveName(drivespec) : 返回指定的驱动器的名称
(2)与文件夹有关的方法:
BuildPath(path, name) : 在已有路径path上新建指定的文件或文件夹
CopyFolder(source, destination, overwrite) : 从指定文件夹中复制一个或多个文件夹到目标文件夹,包括文件夹中的所有文件。
CreateFolder(foldername) : 创建一个名称为foldername的文件夹
DeleteFolder(foldername) : 删除指定的文件夹
FolderExists(folderspec) : 返回指定的文件夹是否存在
GetAbsolutePathName(pathspec) : 返回指定文件夹的绝对路径
GetFolder(folderspec) : 返回指定文件夹对应的Folder对象
GetParentFolderName(pathspec) : 返回指定文件或文件夹的上一级文件夹的名称
GetSpecialFolder(folderspec) : 返回与特定的Windows文件夹相对应的Folder对象
MoveFolder(source, destination) : 将指定的一个或多个文件夹移动到指定的目标文件夹,包括文件夹中的所有文件。
(3)与文件有关的方法:
CopyFile(source, destination, overwrite) : 将指定的文件复制到目标文件夹(可以包含通配符)
CreateTextFile(filename, overwrite, unicode) : 创建指定名称的文本文件,返回与其对应的TextStream对象。
DeleteFile(filespec, force) : 删除指定的文件(可以包含通配符)
FileExists(filespec) : 返回指定的文件是否存在
GetBaseName(filespec) : 返回指定文件的名称(不含扩展名)
GetExtensionName(filespec) : 返回指定文件的扩展名
GetFile(filespec) : 返回指定文件对应的File对象
GetFileName(pathspec) : 返回指定的文件路径或文件名
GetTempName() : 返回一个随机产生的临时文件名
MoveFile(source, destination) : 移动文件到指定的目标文件夹(可以包括通配符)
OpenTextFile(filename, iomode, create, format) : 创建或打开指定名称的文本文件
在FileSystemObject中包含的集合有Drive、Folder、File三个,具体的使用方法请参考下面的应用示例。
2)文件系统定位
FileSystemObject对象的方法主要用于对具体对象的操作,可以根据实际需要灵活运用。有一些方法可以得到对其它对象的引用,因此可以在服务器的文件系统和网络驱动器中定位。
由于对于如何访问文件系统的不同部分,要求具有极高的灵活性,因而造成FileSystemObject对象的复杂性。
FileSystemObject对象的属性、方法与对象之间的关系,请参考下图。
OpenTextFile方法
Folder对象
Folders集合
File对象
Files集合
SubFolders属性
Files属性
ParentFolder属性
GetFile方法
FileSystemObject对象
Drivers集合
Drive对象
Drives属性
GetDrive方法
RootFolder属性
GetFolder方法
GetSpecialFolder方法
TextStream对象
OpenTextSream方法
CreateTextFile方法
3)FileSystemObject对象示例
(1)使用Drivers集合的Drive对象生成驱动器列表
Set myFSO = Server.CreateObject (“Scripting.FileSystemObject”)
Set myDrivers = myFSO.Drivers
For Each item in myDrivers
Response.Write “DriverLetter: “ & item.DriverLetter & “<br>”
Response.Write “DriverType: “ & item.DriverType & “<br>”
If item.DriverType = 3 Then
If item.IsReady Then
Response.Write “Remote driver with ShareName: “ & item.shareName & “<br>”
Else
Response.Write ‘Remote driver – Isready property returned False<br>”
End If
Else
Response.Write “FileSystem: “ & item.FileSystem & “<br>”
Response.Write “SerialNumber: “ & item.SerialNumber & “<br>”
Response.write “Local drive with VolumeName: “ & item.VolumeName & “<br>”
Response.Write “AvailableSpace: “ & item.AvailabkeSpace & “ bytes<br>”
Response.Write “FreeSpace: “ & item.FreeSpace & “ bytes<br>”
Response.Write “TotalSize: “ & & item.totalSize & “ bytes<br>”
End If
Next
(2)使用Folder对象遍历C根目录下的所有文件夹
Set myFSO = Server.CreateObject (“Scripting.FileSystemObject”)
Set myDriveC = myFSO.GetDrive (“c:”)
Set myRoot = myDriveC.RootFolder
Set myFolder = myRoot.SubFolders
For Each item in myFolder
Response.Write “Name: “ & myFolder.Name & “ ”
Response.Write “ShortName: “ & myFolder.ShortName & “ ”
Response.Write “Type: “ & myFolder.Type & “<br>”
Response.Write “Path: “ & myFolder.Path & “ ”
Response.Write “ShortPath: “ & myFolder.ShortPath & “<br>”
Response.Write “Created: “ & myFolder.dateCreated & “ ”
Response.Write “LastModified: “ & myFolder.DateLastModified & “<p>”
Next
(3)使用File对象显示C驱动器的第一个文件夹的文件列表
Set myFSO = Server.CreateObject (“Scripting.FileSystemObject”)
Set myDirveC = myFSO.GetDrive (“c:”)
Set myRoot = myDriveC.RootFolder
Set myFolers = myRoot.SubFolders
For Each item in myFolders
Set myFolder1 = myFolders.Item (item.Name)
Exit For
Next
For Each item in myForder1.Files
Response.Write “Name: “ & item.Name & “ ”
Response.Write “ShortName: “ & item.ShoartName & “ ”
Response.Write “Size: “ & item.Size & “ bytes ”
Response.Write “Type: “ & item.Type & “<br>”
Response.Write ‘Path: “ & item.Path & “ ”
Response.Write “ShortPath: “ & item.ShortPath & “<br>”
Response.Write “Created: “ & item.DateCreated & “ ”
Response.Write “LastModified: “ & item.DatelastModified & “<p>”
Next
3.TextStream对象
1)创建TextStream对象的方法
通过CreateTextFile、OpenTextFile和OpenAsTextStream方法,可以打开或创建一个文本文件,并返回一个TextStream对象。
(1)创建新的文本文件
可以用CreateTextFile方法创建新的文本文件,或覆盖一个已经存在的文件。返回的TextStream对象可用来进行文件的读写。
Set myFSO = Server.CreateObject (“Scripting.FileSystemObject”)
Set myTStream = myFSO.CreateTextFile (“C:\TextFiles\myFile.txt”, True, False)
一旦创建了新文件,就可以使用返回的TextStream对象(myTStream)对文件进行操作。
(2)打开已经存在的文本文件
OpenTextFile方法用于打开一个已有的文本文件。它返回一个TextStream对象,可用这个对象对文件读或追加数据。
从一个文件中读取数据:
Set myFSO = Server.CreateObject (“Scripting.FileSysytemObject”)
Set myTStream = myFSO.OpenTextFile (“C:\TextFiles\myFile.txt”, ForReading)
写入一个文件或创建一个不存在的文件:
Set myFSO = Server.CreateObject (“Scripting.FileSysytemObject”)
Set myTStream = myFSO.OpenTextFile (“C:\TextFiles\myFile.txt”, ForWriting, True)
打开一个已有的Unicode文件,对其追加数据,但是不创建不存在的文件:
Set myFSO = Server.CreateObject (“Scripting.FileSysytemObject”)
Set myTStream = myFSO.OpenTextFile (“C:\TextFiles\myFile.txt”, ForAppending, False, TristateTrue)
(3)作为TextStream对象打开一个文件对象
File对象的OpenAsTextStream方法打开与该对象相应的文件,并且返回一个能对该文件进行读、写和追加的TextStream对象。给定一个File对象(不是FileSystemObject对象)—myFileObject,可以作为一个非Unicode TextStream对象打开它,并追加文件内容:
Set myTStream = myFileObject.OpenAsTextStream (ForAppending, False)
注意,这种方法不需要指定文件名,因为程序的执行通过引用File对象进行,并且没有Create参数,因为该文件必须存在。如果从一个新的空文件开始:
Set myTStream = myFileObject.OpenAsTextStream (ForWriting)
如果读取该文件:
Set myTStream = myFileObject.OpenAsTextStream (ForReading)
2)TextStream对象的方法与属性
属性:
AtEndOfLine : 文件指针是否在文件中一行的末尾
AtEndOfStream : 文件指针是否在文件的末尾
Column : 从1开始返回文件当前字符的列号
Line : 从1开始返回文件当前字符的行号
AtEndOfLine和AtEndOfStream属性仅对iostream参数为ForReading的方式打开的文件可用。
方法:
Close() : 关闭一个打开的文件
Read(numchars) : 从文件中读取numchars个字符
ReadAll() : 作为单个字符串读出整个文件
ReadLine() : 作为一个字符串读取一行
Skip(numchars) : 当从文件中读出时,跳过numchars个字符
SkipLine() : 当从文件中读出时,跳过下一行
Write(string) : 向文件写入字符串
WriteLine(string) : 向文件写入字符串和换行符
WriteBlankLines(n) : 向文件写入n个换行符
3)TextStream对象示例
示例文件显示存储在磁盘上名字为myFile.txt的文件的文本内容。在<TextArea>控件里显示的内容允许进行编辑,通过3个按钮执行不同的操作。三个按钮的作用分别是用<TextArea>控件的内容更新最初的文本,在已有文件内容的后面添加文本,或用初始的缺省内容重写文件。
(1)读取已存在的文本文件的内容
每次打开该页面,打开文本文件并将读取的内容置入<TextArea>控件。
<% strTextFile = Server.MapPath (“myFile.txt”) //取得myFile.txt的绝对物理路径
Set objFSO = Server.CreateObject (“Scripting.FileSystemObject”) //创建文件系统对象的实例
%>
<Form action=”<%=Request.ServerVariables(“Script_Name”) %>” method=post>
The contents of the disk file <b><%=strTextFile %></b> are: <p>
<TextArea name=”txtContent” rows=”10” cols=”50” warp=”physical”>
<% Set objTStream = objFSO.OpenTextFile (strTextFile, ForReading)
//打开文本文件并返回TextStream对象
Do While Not objTStream.AtEndOfStream //读取文件信息
intLineNum = objTStream.Line //获得行号
strLineNum = Right(“00” & CStr(strLineNum), 3) //格式化行号,并转化成字符
strLineText = objTStream.ReadLine //读取当前行的信息
Response.Write strLineNum & “ : “ & strLineText & vbCrLf
Loop
ObjTStream.Close
%></TextArea><p>
(2)更新文本文件的内容
当点击页面的Update按钮时,将把<TextArea>控件中的内容重新写入到该文本文件内。
如果点击Update按钮,收集<TextArea>控件的内容作为一个字符串,分离这个字符串使之成为独立文本行的数组,并且打开文本文件准备重写内容,然后遍历刚刚创建的数组,按行号循环写入该行的内容。
If Len(Request.Form(“cmdUpdate”)) Then //获取是否点击Update按钮
strNewText = Request.Form(“txtContent”) //获取新的文本信息
arrLines = Split(strNewText, vbCrLf) //以vbCrLf为分隔符猜分为数组
Set objTStream = objFSO.OpenTextFile (strTextFile, ForWriting) //以写入的方式打开文件
For intLine = 0 To Ubound(arrLines)
strThisLine = arrLine(intLine)
If Len(strThisLine) > 4 Then //写入该行的信息
objTStream.WriteLine Mid(strThisLine, 6)
End If
Next
objTStream.Close
End If
(3)向文本文件追加内容
当点击Append按钮时,可对已有的文件追加内容。与修改文件的内容区别在于打开文件是为了追加内容而不是改写文件。
If Len(Request.Form(“cmdAppend”)) Then //获取是否点击Append按钮
strNewText = Request.Form(“txtContent”) //获取新的文本信息
arrLines = Split(strNewText, vbCrLf) //以vbCrLf为分隔符猜分为数组
Set objTStream = objFSO.OpenTextFile (strTextFile, ForAppending, False) //以追加的方式打开文件
For intLine = 0 To Ubound(arrLines)
strThisLine = arrLine(intLine)
If Len(strThisLine) > 4 Then //写入该行的信息
objTStream.WriteLine Mid(strThisLine, 6)
End If
Next
objTStream.Close
End If
(4)重写缺省内容
Restore按钮用来将初始的缺省内容简单的重写回文本文件。
If Len(Request.Form(“cmdRestore”)) Then //获取是否点击Restore按钮
Set objTStream = objFSO.CreateTextFile (strTextFile, True, False) //写入默认的文本信息
objTStream.WriteLine “At last I can create with VBScript!”
objTStream.WriteLine
objTStream.WriteLine “Here are three blank lines:”
objTStream.WriteBlankLine 3
objTStream.Write “…and this is “
objTStream.WriteLine “the last line.”
objTStream.Close
End If