5.4.1 filesystemobject对象成员概要
filesystemobject对象提供一个属性和一系列方法,可用它们来操纵filesystemobject对象实现的一些从属对象。这里提供了全部的内容概要,然后介绍每一个从属对象。
1. filesystemobject的属性
filesystemobject对象只有一个属性,它用于得到当前机器上的所有有效驱动器的列表,如表5-4所示:
表5-4 filesystemobject对象的属性及说明
属 性
说 明
drivers
返回本地计算机可用的驱动器列表。
2. filesystemobject的方法
filesystemobject对象提供了使用从属对象的一系列方法,从属对象包括drive、folder和file等对象。它也实现了用于textstream对象的两个方法:createtextfile和opentextfile。根据所使用的对象的类型,将方法划分为三类。
(1) 与驱动器有关的方法
与驱动器有关的方法如表5-5所示:
表5-5 与驱动器有关的方法及说明
方 法
说 明
driveexists(drivespec)
如果在drivespec中指定的驱动器存在,则返回true,否则返回false。drivespec参数可以是一个驱动器字母,或者是文件、文件夹的完整绝对路径
getdrive(drivespec)
返回drivespec指定的驱动器所对应的drive对象。drivespec可以包含冒号、路径分隔符或者是网络共享名,即:“c”、“c:”、“c:\”及“\\machine\sharename”
getdrivename(drivespec)
用字符串返回drivespec指定的驱动器的名称。drivespec参数必须是文件或文件夹的绝对路径,或者仅仅是驱动器字母,例如:“c:”或“c”
(2) 与文件夹有关的方法
与文件夹有关的方法如表5-6所示:
表5-6 与文件夹有关的方法及说明
方 法
说 明
buildpath(path,name)
在已有的路径path上增添名字为name的文件或文件夹,如果需要,则增添路径分隔符’\’
copyfolder(source,destination,overwrite)
从指定的源文件夹source(可以包含通配符)中复制一个或多个文件夹到指定的目标文件夹destination,包含了源文件夹中的所有文件。如果source包含通配符或destination末尾是路径分隔符(‘\’),那么认为destination是要放置源文件夹的拷贝的文件夹。否则的话,认为destination是要创建的新文件夹的路径名。如果destination文件夹已经存在且overwrite参数设置为false,将产生错误,缺省的overwrite参数是true
createfolder(foldername)
创建一个路径名为foldername的文件夹。如果foldername已经存在将产生错误
deletefolder(folderspec,force)
删除由folderspec指定的一个或多个文件夹(可以在路径的最后部分包含通过配符)及文件夹中的所有内容。如果可选的force参数设置为true,那么即使文件夹包含的文件具有只读属性,也将删除该文件夹。缺省的force参数是false
folderexist(folderspec)
如果folderspec指定的文件夹存在则返回true,否则返回false。folderspec参数可以包含文件夹的绝对或相对路径,或者仅仅是当前文件夹中看到的文件夹名
getabsolutepathname(pathspec)
返回明确指定文件夹的路径,其中要考虑到当前文件夹的路径。例如,如果当前文件夹是“c:\docs\sales\”,而pathspec是“jan”,返回的字符是“c:\docs\sales\jan”。通配符、”..”和”\\”路径操作符都是可以接受的
getfolder(folderspec)
返回folderspec指定的文件夹对应的folder对象。folderspec可以是文件夹的相对的或绝对的路径
getparentfoldername(pathspec)
返回pathspec文件或文件夹的上一级文件夹。不检验该文件夹是否存在
getspecialfolder(folderspec)
返回一个特定的windows文件夹相对应的folder对象。参数folderspec的允许值是windowsfolder(0)、systemfolder(1)和temporaryfolder(2)
movefolder(source,destination)
将source指定的一个或多个文件夹移动到destination指定的文件夹。在source里可以包含通配符,但在destination中不行。如果source包含通配符或destination末尾是路径分隔符(‘\’),则认为destination是要放置源文件夹的文件夹,否则认为它是一个新文件夹的完整路径和名字。如果目的文件夹destination已经存在则产生错误
(3) 与文件有关的方法
与文件有关的方法如表5-7所示:
方 法
说 明
copyfile(source,destination,
overwrite)
将source(可包含通配符)指定的一个或多个文件复制到指定的目标文件夹destination。如果source包含通配符或destination末尾是路径分隔符(‘\’),那么认为destination是文件夹。否则认为destination为一新文件的完全路径和名称。如果目标文件夹已经存在且overwrite参数设置为false,将产生错误。缺省的overwrite参数是true
createtextfile(filename,overwrite,
unicode)
用指定的文件名filename在磁盘上创建一个新的文本文件,并返回与其对应的textstream对象,如果可选的overwrite参数设置为true,则覆盖同一路径下已有的同名文件。缺省的overwrite参数是false。如果可选的unicode参数设置为true,则该文件的内容将存储为unicode文本,缺省的unicode参数是false
delefile(filespec,force)
删除由filespec指定的一个或多个文件(可以在路径的最后部分包含通配符)。如果可选的force参数设置为true,那么也删除具有只读属性的文件。缺省的force参数是false
fileexists(filespec)
如果filespec指定的文件存在则返回true,否则返回false。filespec参数可以包含文件的绝对路径或相对路径,或者是当前文件夹中的文件名
getbasename(filespec)
返回filespec指定的文件的名称,即包含文件路径但去掉了文件的扩展名
getextensionname(filespec)
返回filespec指定的文件的扩展名
getfile(filespec)
返回filespec指定的文件所对应的file对象。可以指定文件的相对或绝对路径
getfilename(pathspec)
返回pathspec指定的文件的路径或文件名,如果没有文件名就返回最后的文件夹名。不检查该文件或文件夹是否存在
gettempname()
返回一个随机产生的文件名,用于完成运算所需的临时文件或文件夹
movefile(source,destination)
将source指定的一个或多个源文件移动到destination指定的目的文件夹。在source里可以包含通配符,但destination不行。如果source包含通过配符或destination末尾是路径分隔符(‘\’),那么认为destination是一文件夹。否则,认为destination是一新文件夹的完整路径和名称。如果目的文件夹已经存在则产生错误
opentextfile(filename,iomode,create,
format)
创建一个名叫做filename的文件,或打开一个现有的名为filename的文件,并且返回一个与其相关的textstream对象。filename参数可以包含绝对或相对路径。iomode参数指定了所要求的访问类型。允许的数值是forreading(1)(缺省)、forwriting(2)、forappending(8)。当写入或追加到一个不存在的文件时,如果create参数设置为true,就将创建一个新文件。缺省的create参数是false。format参数说明对文件读或写的数据格式。允许数值是:tristatetfalse(0)(缺省),按照ascii格式打开;tristatettrue(-1),按照unicode格式打开;tristatedefault(-2),用系统缺省格式打开
unicode文件使用两个字节标识每个字符,取消了ascii字符最多256个的限制。
5.4.2 使用驱动器
下面是使用filesystemobject对象的简单例子,它使用driveexists方法得到现有的驱动器字母的列表:
‘ in vbscript
set objfso = server.createobject(“scripting.filesystemobject”)
for intcode = 65 to 90 ‘ansi codes for ‘a’ to ‘z’
strletter = chr(intcode)
if objfso.driveexists(strletter) then
response.write “found drive “ & strletter & “:<br>”
end if
next
或用jscript:
// in jscript
var objfso = server.createobject(‘scripting.filesystemobject’);
for (var intcode = 65; intcode <= 90; intcode++) { //ansi codes for ‘a’ to ‘z’
strletter = string.formcharcode(intcode);
if (objfso.driveexists(strletter))
response.write (‘found drive ‘ + strletter + “:<br>”);
}
这两个程序段的运行结果是相同的,如图5-9所示:
图5-9 驱动器列表
这一页面为driveexists_vb.asp,由本书的示例文件提供。
1. drive对象
正如已经看到的,filesystemobject对象包含一个属性——drives,它返回一个包括本地计算机上所有可用驱动器的集合。
drives集合里的每个条目是一个drive对象。drive对象的属性如表5-8所示:
表5-8 drive对象的属性及说明
属 性
说 明
availablespave
考虑了帐户定额和/或其他限制,返回驱动器上对于该用户可用的空间的大小
driveletter
返回驱动器的字母
drivetype
返回驱动器的类型。返回值可以是unknown(0)、removeable(1)、fixed(2)、network(3)、cdrom(4)和ramdisk(5)。然而需要注意的是当前版本的scrrun.dll不支持预定义常数network,必须使用十进制3来代替
filesystem
返回驱动器文件系统的类型。返回值包括“fat”、“ntfs”和“cdfs”
freespace
返回驱动器上可用剩余空间的总量
isready
返回一个布尔值表明驱动器是否已准备好
path
返回一个由驱动器字母和冒号组成的驱动器路径,即“c:”
rootfolder
返回代表的驱动器根目录文件夹的folder对象
serialnumber
返回一个用于识别磁盘卷的十进制的序列号
sharename
如果是一个网络驱动器,返回该驱动器的网络共享名
totalsize
返回驱动器的总容量(以字节为单位)
volumename
设定或返回本地驱动器卷名
因此,通过使用drives集合里的drive对象,可以在服务器上产生一个驱动器列表,与通过检查每个可能的驱动器字母来判别驱动器是否存在的方法相比,效率更高。我们也可以得到关于该驱动器的信息。在vbscript里,代码如下:
in vbscript:
create a filesystemobject instance
set objfso = server.createobject("scripting.filesystemobject")
create a drives collection
set coldrives = objfso.drives
iterate through the drives collection
for each objdrive in coldrives
response.write "driveletter: <b>" & objdrive.driveletter & "</b> "
response.write "drivetype: <b>" & objdrive.drivetype
select case objdrive.drivetype
case 0: response.write " – (unknown)"
case 1: response.write " – (removable)"
case 2: response.write " – (fixed)"
case 3: response.write " – (network)"
case 4: response.write " – (cdrom)"
case 5: response.write " – (ramdisk)"
end select
response.write "</b> "
if objdrive.drivetype = 3 then
if objdrive.isready then
response.write "remote drive with sharename: <b>" & objdrive.sharename & "</b>"
else
response.write "remote drive – <b>isready</b> property returned_
<b>false</b><br>"
end if
else if objdrive.isready then
response.write "filesystem: <b>" & objdrive.filesystem & "</b> "
response.write "serialnumber: <b>" & objdrive.serialnumber & "</b><br>"
response.write "local drive with volumename: <b>" & _
objdrive.volumename & "</b><br>"
response.write "availablespace: <b>" & formatnumber( _
objdrive.availablespace / 1024, 0) & "</b> kb "
response.write "freespace: <b>" & formatnumber( _
objdrive.freespace / 1024, 0) & "</b> kb "
response.write "totalsize: <b>" & formatnumber(_
objdrive.totalsize / 1024, 0) & "</b> kb"
end if
response.write "<p>"
end if
next
注意,不能用预定义常数network比较驱动器的drivetype属性,因为(至少在scrrun.dll的当前版本中)在类型库中省略了network常数,因此不再作为公用的常数使用。
在jscript中,该程序是:
// in jscript:
// create a filesystemobject instance
var objfso = server.createobject(scripting.filesystemobject);
// create a drives collection
var coldrives = new enumerator(objfso.drives);
for (; !coldrives.atend(); coldrives.movenext()) {
objdrive = coldrives.item();
response.write(driveletter: + objdrive.driveletter + <br>);
response.write(drivetype: + objdrive.drivetype + <br>);
if (objdrive.drivetype == 3)
if (objdrive.isready)
response.write(remote drive with sharename: +
objdrive.sharename + <br>)
else
response.write(remote drive – isready property returned false<br><br>);
else if (objdrive.isready) {
response.write(local drive with volumename: +
objdrive.volumename + <br>);
response.write(filesystem: + objdrive.filesystem + <br>);
response.write(serialnumber: + objdrive.serialnumber + <br>);
response.write(availablespace: + objdrive.availablespace + bytes<br>);
response.write(freespace: + objdrive.freespace + bytes<br>);
response.write(totalsize: + objdrive.totalsize + bytes<p>);
}
}
在系统上运行这段程序以前有一点要注意。如果在a驱动器里没有磁盘,或cd-rom驱动器里没有光盘,将得到一个错误提示:“disk not ready”。除了driveletter属性和drivetype属性外,在使用其他属性和方法前,通过检查每个驱动器的isready属性,可以保护该页面。
当在服务器上运行以上vbscript代码时,运行结果如图5-10所示。这一页面为drivescollection_vb.asp,来自本书提供的示例文件。
图5-10 驱动器详细列表
2. 文件系统定位
filesystemobject的几个方法可用于得到其他对象的引用,因此可以在服务器的文件系统和任何网络驱动器中定位。事实上,在asp代码里使用的所有对象或组件中,除了activex data object组件,filesystemobject对象很可能是最复杂的对象之一。
这种复杂性是由于对如何访问文件系统的不同部分,要求有极高的灵活性。例如,可以从filesystemobject向下通过使用各种从属对象定位一个文件。其过程是从drives集合开始,到一个drive对象,再到驱动器的根folder对象,然后到子folder对象,再到文件夹的files集合,最后到集合内的file对象。
另外,如果已知要访问的驱动器、文件夹或文件。可以直接对其使用getdrive、getfolder、getspecialfolder和getfile方法。图5-11有助于理解所有文件系统定位相关的组件、对象、方法和属性之间的关系。
图5-11 文件系统定位关系
