下载第 5章 脚本运行期库对象前面章节已经介绍了 A S P如何使用在服务器上定义的对象的实例,并充分利用所提供的方法和属性扩展 A S P的性能。有一系列的对象可供使用,包括脚本对象和标准 I I S / A S P安装的组件,以及自己创建的或者从其他供应商处购买的对象。也可以在互联网从各种网站免费下载对象,并在自己的页面上使用。
这一章将讨论由 A S P脚本环境提供的一般称为“脚本运行期库” (Scripting Runtime
L i b r a r y )的对象。这些对象通过正在使用的脚本引擎提供给代码,与 A S P脚本程序一起完成多种实用任务。
还有一种组件是“活动服务器组件” (Active Server Component),通过单独的 A c t i v e X
D L L文件或者其他文件来实现。后面章节将讨论相关内容。
当然,需要研究如何在页面上使用这些对象。在前一章中,我们已经了解了服务器如何提供一个方法来实例化对象,本章将深入讨论这个内容。
本章将介绍以下内容:
脚本引擎以脚本对象方式提供了什么。
如何创建脚本对象及其他组件实例。
脚本对象的成员和属性概要。
如何在代码中使用脚本对象。
下面开始研究脚本对象的定义。
5.1 脚本对象的定义前面章节研究了 A S P对象模型。
对象模型是用来理解系统的各个部分相互关系的一种基本手段。
A S P对象模型提供了一种结构,用来作为一个整体操纵 H T T P请求、响应及 A S P环境中的不同元素。例如,我们已经看到,如何通过查看 A S P请求对象的 c o o k i e集合,得到来自浏览器的任何 c o o k i e值。
我们使用的脚本语言也有对象模型。然而,脚本语言提供的这一对象模型,不同于由
ASP DLL直接提供的对象模型,脚本对象是由 M i c r o s o f t脚本运行期库 ( s c r r u n,d l l )提供的,安装缺省的 Active Scripting脚本引擎时,也安装了 M i c r o s o f t脚本运行期库。
5.1.1 不同类型的对象和组件不要对“对象”和“组件”这两个名词感到困惑,在一定范围内它们都可以作为 A S P的一部分,同样可以通过 C O M对其进行访问。从概念上可以将它们分为四类:
A S P内置对象,如 O b j e c t C o n t e x t,R e q u e s t,R e s p o n s e,A p p l i c a t i o n,S e s s i o n,S e r v e r
和 A S P E r r o r。本书的第 2章到第 4章已经研究了这些内容。
脚本对象。通过脚本运行期库使用,如 D i c t i o n a r y,F i l e S y s t e m和 Te x t S t r e a m。这是本章要讨论的对象。
可安装的组件。由 M i c r o s o f t在 IIS 5.0和 ASP 3.0.标准安装时提供。这将在下一章讨论。
其他组件。从其他独立厂商购买的、在网站上发现的或者自己创建的组件。还有一些其他的由 Wi n d o w s服务或产品提供的组件,如 Windows Scripting Host。在本书的附录中提供了相应的列表,本书专门有一部分章节讲述如何构建自己的组件。
5.1.2 VBScript和 J S c r i p t脚本对象作为脚本运行期库的一部分,M i c r o s o f t提供三个主要的对象:
D i c t i o n a r y对象提供一个极为有用的存储对象,它用来存储值,通过对象的名字而不是其索引进行访问和引用。例如,对于存储从 ASP Request对象中检索到的名称 /值对,这是非常合适的。
F i l e S y s t e m O b j e c t对象提供了对服务器底层文件系统的访问 (在客户端上使用 I E 5,0,与名为,Hypertext Application(HTA )”的特殊类型的页面协同使用 )。可用 F i l e S y s t e m O b j e c t
对象遍历计算机的本地及网络的驱动器、文件夹和文件。
Te x t S t r e a m对象提供对存储在磁盘上文件的访问,用于同 F i l e S y s t e m O b j e c t对象协同使用。
Te x t S t r e a m对象能够读出或写入文本 (顺序的 )文件,并仅能通过 F i l e S y s t e m O b j e c t对象进行实例化,所以人们常常认为 Te x t S t r e a m对象是 F i l e S y s t e m O b j e c t对象的子对象。
F i l e S y s t e m O b j e c t对象是其他一系列用来与文件系统交互的对象和集合的“父代” 。该对象提供了对象的三个集合,D r i v e s,F o l d e r s和 F i l e s集合,每个集合分别是相应的 D r i v e、
F o l d e r和 F i l e对象的集合。它们用来进行磁盘上的驱动器、文件夹 (目录 )和文件的遍历和定位。
对象间的关系如图 5 - 1所示。
图 5-1 脚本运行期库中对象间关系下面,将依次介绍这些对象和集合,以及如何使用它们。然而,首先要理解对象实例与组件的创建或实例化方式之间的差异。这是下一节的主要内容。
第 5章 脚本运行期库对象 计计 135下载
Drive对象
FileSystemObject对象脚本运行期
TextStream对象
Dictionary对象Drives集合
Folders集合
Files集合
Folder对象
File对象
5.2 创建对象和组件实例创建脚本运行期库对象的实例与创建任何其他对象和组件的实例化方式完全相同。可使用 ASP Server对象提供的 C r e a t e O b j e c t方法 (确保对象创建在当前页面的环境内 ),或者使用一个 < O B J E C T >元素。我们将研究这两种方法,究竟采用那种方法依赖于页面的需要。
5.2.1 使用 S e r v e r,C r e a t e O b j e c t方法正如在研究 S e r v e r对象的时候看到的,组件或其他对象实例可根据它们的 P r o g I D来创建:
P r o g I D字符串“正式的”格式是“供应商,组件,版本”,供应商的名字和版本是可选的。
通常 P r o g I D只包含前两部分 (如上例 )。少数供应商在 P r o g I D中设置版本编号,这将避免向后兼容的新版本使用同样的 P r o g I D,这要求改变 A S P页面才能使用新版本。
5.2.2 使用 < O B J E C T >元素可以使用标准的 H T M L < O B J E C T >元素通过增加 R U N AT参数并指定其值为,S E RV E R”
来在服务器上创建一个组件实例。另外,通常是提供对象的 P r o n g I D字符串而不是数字的
C l a s s I D:
如果上面脚本的对象有相应的属性可在脚本中使用,在 < O B J E C T >元素内可通过
< PA R A M >元素进行设置,就像通常在 H T M L页面中所做的一样。在 A P S中使用 < O B J E C T >元素时不要求 C O D E B A S E属性,当其不可用时,服务器不会试图下载以及安装对象或对象。
1,指定一个 C l a s s I D
另外,可以指定想要创建的对象或组件的 C I a s s I D。在不知道目标机安装了什么其他组件的情况下,这是非常有用的。例如在客户端上的浏览器的页面上实例化组件时。
在理论上,组件的 P r o g I D (文本“供应商,组件” )不应该相互冲突,应该是唯一的。然而,
这不是无懈可击的。有可能美国北方的一个供应商与希腊小岛上的一个供应商同名。但是,
使用 C l a s s I D识别访问时,因为 C l a s s I D是唯一的,同名情况就不会发生。
如果决定使用对象或组件的 C l a s s I D,应将其放入 C L A S S I D属性中,而不是 P R O G I D属性。
如:
但在自己的服务器上实例化对象时,应该知道对象和组件的安装方式。这样在 A S P代码
136计计 ASP 3 高级编程 下载中创建对象实例时,可以安全地使用 P r o n g I D。这就是 C l a s s I D很少在 A S P页面内使用的原因。
然而,因为 P r o g I D用于查找 C L S I D,如果愿意也可以用组件或对象的 C l a s s I D代替 P r o g I D。
2,设置对象实例的作用域缺省情况下,所有在 A S P页面中创建的对象与组件实例 (无论用 S e r v e r,C r e a t e O b j e c t方法或
< O B J E C T >元素 )都有页面内的作用域 (page scope)。这意味着,对象与组件只有该页在 A S P上运行时才存在,当页面完成并且把结果发送到客户端以后就自动地取消了。
然而,如果在 g l o b a l,a s a文件 (它存在于站点或虚拟应用程序的根目录 )中放置 < O B J E C T >声明,可以将对象或组件的作用域指定为应用程序或会话作用域。
(1) 在应用程序层作用域创建对象通过设置 S C O P E属性为,A P P L I C AT I O N”,创建应用程序层作用域对象:
应用程序开始时就创建了对象实例,即一旦用户从虚拟应用程序的目录请求一个页面,
就创建对象实例。对于缺省 W e b 站点,这可以是站点上的任一目录。直到应用程序结束 (最后的用户会话结束 )前,对象实例一直存在,并且可以被虚拟应用程序或站点目录内任一页面内的任意用户引用和使用。
(2) 在会话层作用域创建对象如果想创建由单个用户使用的对象实例,其作用域为他访问的所有页面,可创建会话层作用域对象。这通过将 S C O P E属性设置为,S E S S I O N”来实现:
对象一旦被引用就被创建,引用是由用户从虚拟应用程序或站点载入的页面内的程序代码完成的 (在 g l o b a l,a s a文件中有 < O B J E C T >声明 )。当用户会话生命周期结束并被取消时,它引用的对象实例也就取消了。
(3) 关于作用域和状态使对象实例的作用域为全局的或者为用户会话全局环境看起来是一个好主意,但在实际使用时有些问题需要考虑,其中之一是在用户的许多请求之间能够有效地保护对象的状态。换句话说,可以设定对象的一些属性,它们对使用的所有页面是共用的。因为不必每次都创建新的实例并设置其属性,所以这看起来是个较好的办法。
事实上,微软建议一般情况下不要这样做,这一思想是传统程序设计思想的残余。在
We b上,要面对的最大问题是服务器以及 We b应用程序及所提供的动态网页如何应付数以百万计的网站访问者。将组件实例驻留在内存中等待一个特定用户的页面请求,对可能有几百个用户同时浏览的网站来说,这样做不能有效地使用资源。
Window 2000提供新的 C O M +运行期特性,它能够处理组件的创建、缓存和使用,采用一种吞吐量最大化但所占服务器资源最小化的方式。对象实例存储在哪里和存储多久的问题,
最好由操作系统自己完成,而不是由程序员决定。
也就是说,在页面内需要的地方创建对象实例,当页面终止时让其消失。 C O M +整理这些碎片,自动处理后台的一些复杂工作。如果要了解有关这方面的内容,第 1 4章比较详细地第 5章 脚本运行期库对象 计计 137下载研究了组件的创建。
当然,在某种情况下,我们可能要求一个对象具有应用程序层和会话层的作用域,尤其是在页面请求间保存状态时。在后面讨论 D i c t i o n a r y对象时,将有一个这方面的实例。
5.2.3 Server,C r e a t e O b j e c t与 < O B J E C T >的区别
S e r v e r,C r e a t e O b j e c t方法立即创建一个对象实例。在大多数情况下这也是我们所希望的。
而 < O B J E C T >元素只有首次引用一个对象时才创建指定的对象实例。因此如果在代码中停止使用该对象,则不创建该对象实例。
如果代码只在某种情况下使用这个对象 (可能依赖于请求参数的值 ),这也许是有用的。因为如果不需要这个对象,则可以节省服务器的资源。
然而,如果肯定需要创建某一对象,可使用 S e r v e r,C r e a t e O b j e c t方法完成。用 < O B J E C T >
元 素 创 建 对 象 有 助 于 防 止 在 代 码 中 取 消 对 对 象 的 调 用 时,忘 记 取 消 程 序 中 的
S e r v e r,C r e a t e O b j e c t行,当然这是一个粗心的程序设计。
最后需要记住的是,如果对象是使用 S e r v e r,C r e a t e o b j e c t方法创建的,就可以从会话或应用程序中去掉对象,但使用 < O B J E C T >元素创建的,则不行。
5.2.4 组件线程模型在页面内使用对象或组件时,应该考虑的另一个问题是该对象涉及到的响应多个请求的行为方式。事实上在 A S P里,这是所需要理解的最复杂的题目之一。一个组件的线程模型,
结合其作用域,影响该组件和应用程序的性能和效率,也影响将它实例化的 A S P页面。
线程就是由处理器执行的系统对象,用于完成由组件代码定义的任务。每一个线程都可以被认为是单个二进制指令集。在像 Wi n d o w s这样的多线程环境中,多个线程可同时运行。
实际上有五个线程模型 (包括在 Windows 2000里引入的 N e u t r a l - t h r e a d i n g模型 ):
Single-threaded(单线程 ):某一时刻只能有一个进程使用某组件。
Apartment-threaded (单元线程 ):若干进程都可以使用某组件,但只有一个在指定的线程上。
N e u t r a l - t h r e a d e d (中立线程 ):若干进程都能使用某组件,并且可以使用指定的一组线程中的任何一个。
M u l t i p l e - t h r e a d e d或 Free-threaded (多线程或自由线程 ):若干进程都能使用某组件,并且这些进程可以运行在不同的线程上。
Both-threaded(双线程 ):对象既可以是单元线程的又可以作为自由线程的。
在这里不解释线程模型的技术细节,本书后面有相应的内容。
单元线程的组件 (例如使用 Visual Basic创建的或作为 X M L脚本的组件 )可在页面层作用域内很好地运行,在会话层作用域内也是可以接受的。事实上,在页面层,由于较低的数据处理开销,也能很好地运行双线程的组件。
Windows 2000中的中立线程的模型甚至提供了更好的性能,尽管到目前为止只有很少的这样的组件和与之相适应的开发工具。
138计计 ASP 3 高级编程 下载如果需要会话层组件,使用可用的双线程的组件。并且如果需要应用程序层作用域,可一直使用双线程的组件。
然而,微软建议避免使用会话层作用域的组件,甚至不使用应用程序层作用域的组件,
除非这些组件是绝对需要的。使组件的活动时间超过作用域为页面级的组件所要求的时间,
对于由 C O M +提供代理特性的对象是没有益处的。
5.2.5 引用对象类型库在早先的 A S P版本中,在脚本中使用对象或组件时,组件内定义的公共常数 (如果有的话 )
在 A S P里将不再有效。这意味着我们需要自己声明它们(或等价物)并指定相应的值。
例如,当在早期版本的 A S P中使用 A c t i v e X数据库对象 ( A D O )组件时 (将在第 8章进行详细的研究 ),不得不用记录集的 O p e n方法加入预定义常数声明。例如:
另一种方法是使用 # i n c l u d e指令在页面插入一个名为 a d o v b s,i n c的文件。该文件由 I I S / A S P
提供,包含 A D O所需的所有预定义常数。更新代码时,必须确认使用的是最新版本,并检查它对于所有的页面请求都可用。
对于 IIS 5.0,有一个更好的方法,通过在 H T M L注释元素内使用 M E TA D ATA指令,可以给组件或对象的类型库增加引用 (IIS 4.0不支持这一功能 )。
其中:
p a t h _ a n d _ n a m e _ o f _ f i l e 是某一类型库文件 (.tlb )或 ActiveX DLL的绝对物理路径,必须提供这一参数或者是 t y p e _ l i b r a ry_uuid 参数。
t y p e _ l i b r a ry _ u u i d是该类型库的唯一标识符,必须提供这一参数或者是 p a t h _ a n d
_ n a m e _ o f _ f i l e参数。
m a j o r _ v e r s i o n _ n u m b e r,m i n o r _ v e r s i o n _ n u m b e r (可选 )定义了所需组件的版本。如果没有该版本则使用最近的版本。
locale_id (可选 )是区域标志符。如果在该区域没有发现类型库,计算机将使用缺省的 (安装时定义的 )区域。
因此,使用这一技术,通过使用下面的代码,能使内置的 A D O预定义常数在 A S P页面可用:
文件名 m s a d o 1 5,d l l还可用于更高版本 ( 2,5 0以后 )的 A D O组件。
第 5章 脚本运行期库对象 计计 139下载如果 A S P不能装载类型库,就返回一个错误并停止该页的执行。可能的错误提示如表 5 - 1
所示。
表 5-1 错误提示代码及说明错 误 说 明
ASP 0222 无效的类型库说明
ASP 0223 未找到类型库
ASP 0224 类型库不能加载
ASP 0225 类型库不能打包 (即 A S P不能从指定的类型库中创建类型库包装对象 )
5.2.6 在客户端上创建对象实例在 A S P中讨论在服务器上实例化对象和组件的技术时,值得强调的是在浏览器中运行客户端页面而完成同样工作的方式。如果你使用 A S P创建包含客户端脚本程序的页面,或者使用 < O B J E C T >元素创建客户端组件实例,将会发现这是非常有用的。在大多数情况下,脚本运行期对象可在客户端上实例化和使用,效果与服务器上的 A S P相同。
1,VBScript CreateObject 方法在客户端使用 C r e a t e O b j e c t时,在浏览器的环境内创建组件或对象实例,它们与浏览器运行在相同的内存空间里 (即进程内 ),除非实现的对象是带有,e x e扩展文件名的可执行文件。
通常指定对象的 C I a s s I D,而不是使用 P r o g I D字符串,这样就不可能与其他安装在客户端的对象发生冲突。
当然也可以使用 P r o g I D,并且使用通用的对象或组件 (特别是标准安装提供的对象或组件 ),
那么得到错误的组件的风险是很小的:
2,JScript ActiveXObject方法为了在客户端上实例化 J S c r i p t的对象和组件,必须使用 A c t i v e X O b j e c t方法和 n e w操作符:
或:
3,<OBJECT>元素技术也可使用 < O B J E C T >元素创建客户端对象或组件的实例。应省略 R U N AT属性或者将其设
140计计 ASP 3 高级编程 下载定为,C L I E N T” 。然而,这个属性在客户端上是被忽略的,因此设置这个属性的唯一目的就是,在 A S P页面使用 < O B J E C T >元素实例化服务器端的组件实例时防止混淆。
注意,这里出现的 C O D E B A S E属性,表示允许下载并安装来自 U R L的组件 (如果该组件没有安装 )。 IE 3.0以上的版本有此功能。
对于使用 < O B J E C T >元素的方法、可使用的属性、在客户端使用时的值,可查看网站 h t t p:
/ / m s d n,m i c r o s o f t,c o m / w o r k s h o p / a u t h o r / d h t m l / r e f e r e n c e / o b j e c t s / O B J E C T,a s p,或者 Wi n d o w s
2000 Platform SDK文档中的 < O B J E C T > t a g s”,或者看看,IE5 Dynamic HTML Programmer'
R e f e r e n c e》一书,ISBN 1-861001-74-6,Wrox 出版社。
5.3 Scripting.Dictionary对象许多 M i c r o s o f t的编程语言,如 Visual Basic,V B S c r i p t和 J S c r i p t,都提供集合 ( c o l l e c t i o n )。
可以把集合想象为数组,可以使用其中内建的函数完成存储和操纵数据等基本任务。无须担心数据是在哪些行列,而是使用唯一的键进行访问。
V B S c r i p t和 J S c r i p t都提供类似的对象,通称 S c r i p t i n g,D i c t i o n a r y对象或 D i c t i o n a r y对象。它类似于二维数组,把键和相关条目的数据存放在一起。然而真正的面向对象的方式,不应直接访问数据条目,必须使用 D i c t i o n a r y对象支持的方法和属性来实现。
本章提供了一些示例页面,允许试验脚本运行期对象的方法和属性。这些实例在下载的文件的 C h a p e r 0 5子目录里。
5.3.1 创建和使用 D i c t i o n a r y对象创建一个 D i c t i o n a r y对象的示例如下:
D i c t i o n a r y对象还可用于客户端的 I E中。
1,Dictionary对象的成员概要表 5 - 2和表 5 - 3列出了 D i c t i o n a r y对象的属性和方法及相应的说明。
当增加一个键 /条目对时,如果该键已存在;或者删除一个键 /条目对时,该关键字
/条目对不存在;或改变已包含数据的 D i c t i o n a r y对象的 C o m p a r e M o d e,都将产生错误。
第 5章 脚本运行期库对象 计计 141下载表 5-2 Dictionary对象的属性和说明属 性 说 明
C o m p a r e M o d e (仅用于 V B S c r i p t )设定或返回键的字符串比较模式
C o u n t 只读。返回 D i c t i o n a r y里的键 /条目对的数量
I t e m (k e y) 设定或返回指定的键的条目值
K e y (k e y) 设定键值表 5-3 Dictionary对象的方法和说明方 法 说 明
A d d (k e y,item) 增加键 /条目对到 D i c t i o n a r y
E x i s t s (k e y) 如果指定的键存在,返回 Tr u e,否则返回 F a l s e
Items( ) 返回一个包含 D i c t i o n a r y对象中所有条目的数组
Keys( ) 返回一个包含 D i c t i o n a r y对象中所有键的数组
R e m o v e (k e y) 删除一个指定的键 /条目对
RemoveAll ( ) 删除全部键 /条目对
2,对 D i c t i o n a r y中增加和删除条目一旦得到一个新的 (空的 ) Dictionary,可以对其添加条目,从中获取条目以及删除条目:
在 J S c r i p t中,等价的代码为:
3,修改键或条目的值可以通过修改键的值,或通过修改与特定的键关联的条目的数据,来改变存储在
D i c t i o n a r y内的数据。下面的代码改变键为 M y K e y的条目中的数据。
如果指定的键在 D i c t i o n a r y未找到,将在 D i c t i o n a r y中创建一个以 M y K e y为键,以
N e w Va l u e为其条目值的新的键 /条目对。有意思的是,如果使用一个不存在的键来检索条目,
不仅得到一个空的字符串 (这是可以想到的 ),而且还在 D i c t i o n a r y里添加一个新的键 /条目对,
键即是指定的键,但条目的数据为空。
可以使用 K e y属性仅改变键的值而不改变与之对应的条目的数据。将一个已存在的键
M y K e y改变为 M y N e w K e y,可以用:
142计计 ASP 3 高级编程 下载如果指定的键未找到,则产生运行期错误。
4,设置比较模式
D i c t i o n a r y的 C o m p a r e M o d e属性仅适用于 V B S c r i p t,不能在 J S c r i p t中使用。当比较字符串键时,允许指定比较的方式。两个允许的值为 B i n a r y C o m p a r e ( 0 )和 Te x t C o m p a r e ( 1 )。
B i n a r y C o m p a r e ( 0 )为二进制数对照 (即区分大小写 ); Te x t C o m p a r e ( 1 )为文本对照 (即不区分大小写 )。
5,遍历 D i c t i o n a r y
研究 D i c t i o n a r y时,有两个方法和一个属性需要特别注意,它们允许我们遍历存储在
D i c t i o n a r y里的所有键 /条目对。 I t e m s方法用一个一维数组的形式返回 D i c t i o n a r y里所有的条目数据,而 k e y s方法用一个一维数组返回所有已存在的键值。可以使用 C o u n t属性得到键或条目的数量。
例如,可以使用下列代码得到名称为 b j M y D a t a的 D i c t i o n a r y中所有的键和条目值。注意,
虽然 C o u n t属性保存了在 D i c t i o n a r y里的键 /条目数量,但 V B S c r i p t和 J S c r i p t的数组总是从下标 0
开始的。因此,数组下标应从 0到 Count - 1。
在 V B S c r i p t里也可以使用 For Each..,Next 语句完成同样的功能,
5.3.2 Dictionary对象示例本书提供了一系列示例文件可用来试验脚本运行时间库的各种属性。
本章代码的缺省页面提供了一系列可使用的 V B S c r i p t示例链接。有些示例对 J S c r i p t同样有效。这些示例存放在 C h a p t e r 0 5目录下相应的子目录里,显示的界面如图 5 - 2所示。
第 5章 脚本运行期库对象 计计 143下载图 5-2 ASP脚本运行期对象示例页面要查看 D i c t i o n a r y对象的运行,在菜单页面点击第一个链接,打开名叫 s h o w _ d i c t i o n a r y.
a s p的页面。这个页面显示了我们提供的 D i c t i o n a r y对象的内容,允许试验其属性和方法。屏幕如图 5 - 3所示。
图 5-3 Dictionary对象的属性和方法
1,Dictionary的 g l o b a l,a s a文件随 D i c t i o n a r y对象示例页面提供的文件之一是 g l o b a l,a s a。它创建并预先填充了一个会话层作用域的 D i c t i o n a r y对象,因此其内容在页面请求之间不会丢失。一般说来 (考虑到可扩展性 ),
这不是一个理想的做法。在这个例子里,可以看到 D i c t i o n a r y的属性和方法的效果。
如果在自己的服务器上下载并安装示例,必须创建一个基于此 global.asa 文件的虚拟应用
144计计 ASP 3 高级编程 下载程序。或者将其内容添加到缺省站点的根文件夹中的 g l o b a l,a s a文件里。在第 3章讲述了如何用向导创建虚拟应用程序。然而对于本示例,创建一个虚拟应用程序最简单的方法是在
C h a p t e r 0 5示例文件夹内右击 d i c t i o n a r y子文件夹,在 P r o p e r t i e s对话框的 Home Directory选项卡里,点击 C r e a t e按钮,如图 5 - 4所示。
图 5-4 创建虚拟应用程序在这个 g l o b a l,a s a文件里,代码使用 < O B J E C T > 元素创建一个会话层作用域的
S c r i p t i n g,D i c t i o n a r y对象实例。然后在 S e s s i o n _ o n S t a r t事件处理程序里将一系列值用 A d d方法放入 D i c t i o n a r y中,并将对 D i c t i o n a r y对象的引用指定给 A S P会话变量 M y D i c t i o n a r y:
2,Dictionary示例页面在,Scripting.Dictionary Object”主页面里,首要的任务是得到一个会话层作用域的 D i c t i o n a r y
对象实例的引用。注意,这个引用是一个对象变量,因此必须在 V B S c r i p t里使用 S e t关键字。
然后,检查一下是否得到了一个对象 (这是个好习惯 ),如果没有正确地建立包含
g l o b a l,a s a文件的虚拟应用程序,检查一下问题出在哪里。你将看到我们自己的消息代替了
A S P的错误消息 (但是注意,对于这一操作必须关闭缺省的错误处理 )。
第 5章 脚本运行期库对象 计计 145下载显示在页面上的 D i c t i o n a r y内容列表是使用 D i c t i o n a r y对象的 K e y和 I t e m s方法创建的两个数组,可使用前面的代码遍历它们。
3,Dictionary页面控件在 D i c t i o n a r y的内容列表下是一系列的 H T M L控件,可用于设定 D i c t i o n a r y对象的某些属性和执行各种方法。这些控件全部在一个 < F O R M >内,其 A C T I O N属性值是本页面,所以窗体的内容提交回本页面。在前面的章节的示例里使用了同样的技术。
在 < F O R M >段中,改变属性或执行一个方法是通过一个按钮 (没有标题 )实现的。用于属性和方法的值放入按钮旁的文本框或列表框中。
该页的第一个按钮用于设定 D i c t i o n a r y里的条目的 K e y属性。这里使用了一个下拉列表,
可以选择一个已经存在的 K e y值。下面的代码创建了页面内该部分的控件。为了填充列表,使用了另外一个遍历 D i c t i o n a r y对象的技术,即 For Each,,,Next语句。代码如下:
146计计 ASP 3 高级编程 下载
4,使用 D i c t i o n a r y的属性和方法在,Scripting.Dictionary Object”页面,点击用来检查并改变条目的 K e y属性的按钮,如图
5 - 5所示。
把窗体再次提交给页面。该页面包含一个脚本段,检查被点击的按钮的值。它通过在 R e q u e s t
,F o r m集合里查找按钮的名字来断定单击的是哪个按钮。如果发现一个对应于 c m d C h a n g e K e y的值,
则从列表中或文本框中得到相应的值并用来改变
K e y属性:
页面重新载入后,在 D i c t i o n a r y的内容列表里能看到相应的结果,如图 5 - 6所示。
页面的其余代码用来设定一个条目的 I t e m
属性,或者执行 D i c t i o n a r y对象的方法。下面是这些操作的代码,每段代码与演示 K e y属性的 代 码 非 常 类 似 。 每 次 都 将 结 果 显 示 在
D i c t i o n a r y的内容列表中:
例如,如果现在点击 A d d方法的按钮,在 D i c t i o n a r y的内容列表里将增加一个新的条目,
如图 5 - 7所示。
第 5章 脚本运行期库对象 计计 147下载图 5-5 使用 D i c t i o n a r y的 K e y属性图 5-6 页面重载后的结果图 5-7 增加一个新方法结果如图 5 - 8所示。
图 5-8 Add方法的结果可以在这个页面中试验 D i c t i o n a r y对象的属性和方法,你将会发现什么因素及在什么环境下能引起 D i c t i o n a r y对象错误。例如,尝试用与已经存在的一个条目相同的键值增加一个条目,
看看会出现什么结果。
5.4 Scripting.FileSystemObject对象
F i l e S y s t e m O b j e c t对象提供对计算机文件系统的访问,它允许我们在代码内操作文本文件、
文件夹及驱动器。它是脚本运行期库提供的对象之一,对于服务器 A S P页面内的 V B S c r i p t和
J S c r i p t都有效。如果页面的扩展名为,h t a (表示它们是 H T A 的一部分 ),它也可用在客户端的 I E
5中。本节仅讨论在服务器上的 A S P脚本如何使用 F i l e S y s t e m O b j e c t对象。
超级文本应用程序 ( H TA )由指定的“受信任的”页面组成,在页面的 < H E A D >段里包含 < H TA,A P P L I C AT I O N >元素。例如:
这些页面可以使用客户端脚本引擎中的一些不常用特性,这些特性中有
F i l e S y s t e m O b j e c t对象和 Te x t S t r e a m对象。关于超级文本应用程序的更多信息,请访问 Microsoft Wo r k s h o p网站。
可以使用下面的程序创建一个 F i l e S y s t e m O b j e c t对象实例:
148计计 ASP 3 高级编程 下载在 A S P页面里,增加一个对于 F i l e S y s t e O b j e c t类型库的引用是非常有用的。这允许使用它直接定义的内置常数,不用像过去那样必须用数字等效表达式来代替。整个脚本运行期库的类型库可以增加到任何 A S P页面中,代码如下:
如果你是在另一个目录下安装 Wi n d o w s,必须编辑 F I L E的属性值。
5.4.1 FileSystemObject对象成员概要
F i l e S y s t e m O b j e c t对象提供一个属性和一系列方法,可用它们来操纵 F i l e S y s t e m O b j e c t 对象实现的一些从属对象。这里提供了全部的内容概要,然后介绍每一个从属对象。
1,FileSystemObject的属性
F i l e S y s t e m O b j e c t对象只有一个属性,它用于得到当前机器上的所有有效驱动器的列表,
如表 5 - 4所示。
表 5-4 FileSystemObject对象的属性及说明属 性 说 明
D r i v e s 返回本地计算机可用的驱动器列表。包括从这台机器映射的网络驱动器
2,FileSystemObject的方法
F i l e S y s t e m O b j e c t对象提供了使用从属对象的一系列方法,从属对象包括 D r i v e,F o l d e r 和
F i l e 等对象。它也实现了用于 Te x t S t r e a m对象的两个方法,C r e a t e Te x t F i l e和 O p e n Te x t F i l e。根据所使用的对象的类型,将方法划分为三类。
(1) 与驱动器有关的方法与驱动器有关的方法如表 5 - 5所示。
表 5-5 与驱动器有关的方法及说明方 法 说 明
DriveExists (d r i v e s p e c) 如果在 d r i v e s p e c中指定的驱动器存在,则返回 Tr u e,否则返回 F a l s e。
d r i v e s p e c参数可以是一个驱动器字母,或者是文件、文件夹的完整绝对路径
GetDrive (d r i v e s p e c) 返回 d r i v e s p e c指定的驱动器所对应的 D r i v e对象。 d r i v e s p e c可以包含冒号、
路径分隔符或者是网络共享名,即," c "," c,"," c,\ "及 " \ \ m a c h i n e \ s h a r e n a m e "
GetDriveName (d r i v e s p e c) 用字符串返回 d r i v e s p e c指定的驱动器的名称。 d r i v e s p e c参数必须是文件或文件夹的绝对路径,或者仅仅是驱动器字母,例如," c,"或 " c "
(2) 与文件夹有关的方法与文件夹有关的方法如表 5 - 6所示。
表 5-6 与文件夹有关的方法及说明方 法 说 明
B u i l d P a t h (path,name) 在已有的路径 p a t h上增添名字为 n a m e的文件或文件夹,如果需要,则增添路径分隔符 '\'
第 5章 脚本运行期库对象 计计 149下载
(续 )
方 法 说 明
CopyFolder (s o u rce,destination,overw r i t e) 从指定的源文件夹 s o u rc e(可以包含通配符 )中复制一个或多个文件夹到指定的目标文件夹 d e s t i n a t i o n,包含了源文件夹中的所有文件。如果 s o u rc e包含通配符或 d e s t i n a t i o n末尾是路径分隔符 ( ' \ ' ),
那么认为 d e s t i n a t i o n是要放置源文件夹的拷贝的文件夹。否则的话,认为 d e s t i n a t i o n 是要创建的新文件夹的路径名。如果
d e s t i n a t i o n文件夹已经存在且 o v e r w r i t e参数设置为 F a l s e,将产生错误,缺省的 o v e r w r i t e参数是 Tr u e
CreateFolder (f l o l d e r n a m e) 创建一个路径名为 f o l d e r n a m e的文件夹。如果 f o l d e r n a m e已经存在将产生错误
DeleteFolder (folderspec,forc e) 删除由 f o l d e r s p e c指定的一个或多个文件夹 (可以在路径的最后部分包含通配符 )及文件夹中的所有内容。如果可选的 f o rc e参数设置为 t r u e,那么即使文件夹包含的文件具有只读属性,也将删除该文件夹。缺省的 f o rc e参数是 F a l s e
FolderExists (f o l d e r s p e c) 如果 f o l d e r s p e c指定的文件夹存在则返回 Tr u e,否则返回 F a l s e。
F o l d e r s p e c参数可以包含文件夹的绝对或相对路径,或者仅仅是当前文件夹中看到的文件夹名
GetAbsolutePathName (p a t h s p e c) 返回明确指定文件夹的路径,其中要考虑到当前文件夹的路径。
例如,如果当前文件夹是 " c,\ d o c s \ s a l e s \ ",而 p a t h s p e c是 " j a n ",返回的字符是 " c,\ d o c s \ s a l e s \ j a n "。通配符,",,"和 " \ \ "路径操作符都是可接受的
GetFolder (f o l d e r s p e c) 返回 f o l d e r s p e c指定的文件夹对应的 F o l d e r对象。 F o l d e r s p e c可以是文件夹的相对的或绝对的路径
GetParentFolderName (p a t h sp e c ) 返回 p a t h s p e c文件或文件夹的上一级文件夹。不检验该文件夹是否存在
G e tSpecialfolder (f o l d e r s p e c) 返回一个与特定的 Wi n d o w s文件夹相对应的 F o l d e r对象。参数
f o l d e r s p e c的允许值是 Wi n d o w s F o l d e r ( 0 ),S y s t e m F o l d e r ( 1 )和
TemporaryFolder (2)
M o v e F o l d e r (s o u rce,destination) 将 s o u rc e指定的一个或多个文件夹移动到 d e s t i n a t i o n指定的文件夹。在 s o u rc e里可以包含通配符,但在 d e s t i n a t i o n中不行。如果
s o u rc e包含通配符或 d e s t i n a t i o n末尾是路径分隔符 ( ' \ ' ),则认为
d e s t i n a t i o n是要放置源文件夹的文件夹,否则认为它是一个新文件夹的完整路径和名字。如果目的文件夹 d e s t i n a t i o n已经存在则产生错误
(3) 与文件有关的方法。
与文件有关的方法如表 5 - 7所示。
表 5-7 与文件有关的方法及说明方 法 说 明
C o p y F i l e (s o u rce,destination,overw r i t e) 将 s o u rc e(可以包含通配符 )指定的一个或多个文件复制到指定的目标文件夹 d e s t i n a t i o n。如果 s o u rc e包含通配符或 d e s t i n a t i o n末尾是路径分隔符 ( ' \ ' ),那么认为 d e s t i n a t i o n一文件夹。否则认为
d e s t i n a t i o n为一新文件的完全路径和名称。如果目标文件夹已经存在且 o v e r w r i t e参数设置为 F a l s e,将产生错误。缺省的 o v e rw r i t e参数是 Tr u e
150计计 ASP 3 高级编程 下载
(续 )
方 法 说 明
CreateTextFile(filename,overwrite,unicode) 用指定的文件名 f i l e n a m e在磁盘上创建一个新的文本文件,并返回与其对应的 Te x t S t r e a m对象,如果可选的 o v e rw r i t e参数设置为
Tr u e,则覆盖同一路径下已有的同名文件。缺省的 o v e rw r i t e参数是 F a l s e。如果可选的 u n i c o d e参数设置为 Tr u e,则该文件的内容将存储为 U n i c o d e文本,缺省的 u n i c o d e参数是 F a l s e
D e l e t e F i l e (filespec,forc e) 删除由 f i l e s p e c指定的一个或多个文件 (可以在路径的最后部分包含通配符 )。如果可选的 f o rc e参数设置为 t r u e,那么也删除具有只读属性的文件。缺省的 f o rc e参数是 F a l s e
FileExists (f i l e s p e c) 如果 f i l e s p e c指定的文件存在则返回 Tr u e,否则返回 F a l s e。 f i l e s p e c
参数可以包含文件的绝对路径或相对路径,或者是当前文件夹中的文件名
GetBaseName (f i l e s p e c) 返回 f i l e s p e c指定的文件的名称,即包含文件路径但去掉了文件的扩展名
GetExtensionName (f i l e s p e c) 返回 f i l e s p e c指定的文件的扩展名
GetFile (filespec ) 返回 f i l e s p e c指定的文件所对应的 F i l e对象。可以指定文件的相对或绝对路径
GetFileName (p a t h s p e c) 返回 p a t h s p e c指定的文件的路径或文件名,如果没有文件名就返回最后的文件夹名。不检查该文件或文件夹是否存在
G e t TempName ( ) 返回一个随机产生的文件名,用于完成运算所需的临时文件或文件夹
MoveFile (s o u rce,destination) 将 s o u rc e指定的一个或多个源文件移动到 d e s t i n a t i o n指定的目的文件夹。在 s o u rc e里可以包含通配符,但 d e s t i n a t i o n不行。如果
s o u rc e包含通配符或 d e s t i n a t i o n末尾是路径分隔符 ( ' \ ' ),那么认为
d e s t i n a t i o n是一文件夹。否则,认为 d e s t i n a t i o n是一新文件夹的完整路径和名称。如果目的文件夹已经存在则产生错误
O p e n TextFile ( filename,iomode,创建一个名叫做 f i l e n a m e的文件,或打开一个现有的名为 f i l e n a m e
c reate,format ) 的文件,并且返回一个与其相关的 Te x t S t r e a m对象。 f i l e n a m e参数可以包含绝对或相对路径。 i o m o d e参数指定了所要求的访问类型。
允许的数值是 F o r R e a d i n g ( 1 ) ( 缺省 ),F o r Wr i t i n g ( 2 ),
F o r A p p e n d i n g ( 8 )。当写入或追加到一个不存在的文件时,如果
c re a t e参数设置为 t r u e,就将创建一个新文件。缺省的 c re a t e参数是
F a l s e。 f o r m a t参数说明对文件读或写的数据格式。允许数值是,Tr i s t a t e F a l s e ( 0 ) (缺省 ),按照 A S C I I格式打开 ; Tr i s t a t e t Tr u e ( - 1 ),
按照 U n i c o d e格式打开 ; Tr i s t a t e U s e D e f a u l t ( - 2 ),用系统缺省格式打开
Unicode 文件使用两个字节标识每个字符,取消了 A S C I I字符最多 2 5 6个的限制。
5.4.2 使用驱动器下面是使用 F i l e S y s t e m O b j e c t对象的简单例子,它使用 D r i v e E x i s t s方法得到现有的驱动器字母的列表:
第 5章 脚本运行期库对象 计计 151下载或用 J S c r i p t:
这两个程序段的运行结果是相同的,如图 5 - 9所示。
这一页面为 d r i v e e x i s t s _ v b,a s p,由本书的示例文件提供。
1,Drive对象正如已经看到的,F i l e s S y s t e m O b j e c t对象包含一个属性 — D r i v e s,它返回一个包括本地计算机上所有可用驱动器的集合。
D r i v e s集合里的每个条目是一个 D r i v e对象。 D r i v e
对象的属性如表 5 - 8所示。
表 5-8 Drive对象的属性及说明属 性 说 明
Av a i l a b l e S p a c e 考虑了帐户定额和 /或其他限制,返回驱动器上对于该用户可用的空间的大小
D r i v e L e t t e r 返回驱动器的字母
D r i v e Ty p e 返回驱动器的类型。返回值可以是 U n k n o w n ( 0 ),R e m o v a b l e ( 1 ),F i x e d ( 2 ),N e t w o k ( 3 )、
C D R o m ( 4 )和 R a m D i s k ( 5 )。然而需要注意的是当前版本的 s c r r u n,d l l不支持预定义常数 N e t w o k,必须使用十进制数 3来代替
F i l e S y s t e m 返回驱动器文件系统的类型。返回值包括,FAT”,,N T F S”和,C D F S”
F r e e S p a c e 返回驱动器上可用剩余空间的总量
I s R e a d y 返回一个布尔值表明驱动器是否已准备好
P a t h 返回一个由驱动器字母和冒号组成的驱动器路径,即,C,”
R o o t F o l d e r 返回代表的驱动器根目录文件夹的 F o l d e r对象
S e r i a l N u m b e r 返回一个用于识别磁盘卷的十进制的序列号
S h a r e N a m e 如果是一个网络驱动器,返回该驱动器的网络共享名
To t a l S i z e 返回驱动器的总容量 (以字节为单位 )
Vo l u m e N a m e 设定或返回本地驱动器卷名因此,通过使用 D r i v e s集合里的 D r i v e对象,可以在服务器上产生一个驱动器列表,与通过检查每个可能的驱动器字母来判别驱动器是否存在的方法相比,效率更高。我们也可以得到关于该驱动器的信息。在 V B S c r i p t里,代码如下:
152计计 ASP 3 高级编程 下载图 5-9 驱动器列表注意,不能用预定义常数 N e t w o r k比较驱动器的 D r i v e Ty p e属性,因为 (至少在
s c r r u n,d l l的当前版本中 )在类型库中省略了 N e t w o r k常数,因此不再作为公用的常数使用。
在 J S c r i p t中,该程序是:
在系统上运行这段程序以前有一点要注意。如果在 A驱动器里没有磁盘,或 C D -
R O M驱动器里没有光盘,将得到一个错误提示:,Disk Not Ready” 。 除了
D r i v L e t t e r属性和 D r i v e Ty p e属性外,在使用其他属性和方法前,通过检查每个驱动器的 I s R e a d y属性,可以保护该页面。
第 5章 脚本运行期库对象 计计 153下载当在服务器上运行以上 V B S c r i p t代码时,运行结果如图 5 - 1 0所示。这一页面为
d r i v e s c o l l e c t i o n _ v b,a s p,来自本书提供的示例文件。
图 5-10 驱动器详细列表
2,文件系统定位
F i l e S y s t e m O b j e c t的几个方法可用于得到其他对象的引用,因此可以在服务器的文件系统和任何网络驱动器中定位。事实上,在 A S P代码里使用的所有对象或组件中,除了 A c t i v e X
154计计 ASP 3 高级编程 下载
F i l e S y s t e m O b j e c t对象
D r i v e s集合
D r i v e对象
F o l d e r对象F o l d e r s集合
Te x t S t r e a m对象 OpenTextFile方法
S u b F o l d e r s
属性
P a r e n t F o l d e r
属性
GetDrive
方法
GetFolder
方法
GetSpecialFolder
方法
G e t F i l e
方法
CreateTextFile
方法
OpenAsTextStream
方法
F i l e s属性
R o o t F o l d e r属性
D r i v e s属性
F i l e s集合
F i l e对象图 5 - 11 文件系统定位关系
Data Objects组件,F i l e S y s t e m O b j e c t对象很可能是最复杂的对象之一。
这种复杂性是由于对如何访问文件系统的不同部分,要求有极高的灵活性。例如,可以从 F i l e S y s t e m O b j e c t向下通过使用各种从属对象定位一个文件。其过程是从 D r i v e s集合开始,
到一个 D r i v e对象,再到驱动器的根 F o l d e r对象,然后到子 F o l d e r对象,再到文件夹的 F i l e s集合,
最后到集合内的 F i l e对象。
另外,如果已知要访问的驱动器、文件夹或文件。可以直接对其使用 G e t D r i v e、
G e t F o l d e r,G e t S p e c i a l F o l d e r和 G e t F i l e方法。图 5 - 11有助于理解所有与文件系统定位相关的组件、对象、方法和属性之间的关系。
3,Folder对象
D r i v e对象的 R o o t F o l d e r属性返回一个 F o l d e r对象,通过该对象可访问这个驱动器内的所有的内容。可以使用这个 F o l d e r对象的属性和方法遍历驱动器上的目录,并得到该文件夹和其他文件夹的属性。
(1) Folder对象的属性
F o l d e r对象提供一组属性,可用这些属性得到关于当前文件夹的更多信息,也可以改变该文件夹的名称。其属性及说明如表 5 - 9所示。
表 5-9 Folder对象的属性及说明属 性 说 明
A t t r i b u t e s 返回文件夹的属性。可以是下列值中的一个或其组合,N o r m a l ( 0 ),R e a d O n l y (1 )、
H i d d e n ( 2 ),S y s t e m ( 4 ),Volume (名称 ) ( 8 ),D i r e c t o r y (文件夹 ) ( 1 6 ),A r c h i v e ( 3 2 )、
A l i a s ( 6 4 )和 C o m p r e s s e d ( 1 2 8 )。例如,一个隐藏的只读文件,A t t r i b u t e s的值为 3
D a t e C r e a t e d 返回该文件夹的创建日期和时间
D a t e L a s t A c c e s s e d 返回最后一次访问该文件夹的日期和时间
D a t e L a s t M o d i f i e d 返回最后一次修改该文件夹的日期和时间
D r i v e 返回该文件夹所在的驱动器的驱动器字母
F i l e s 返回 F o l d e r对象包含的 F i l e s集合,表示该文件夹内所有的文件
I s R o o t F o l d e r 返回一个布尔值说明该文件夹是否是当前驱动器的根文件夹
N a m e 设定或返回文件夹的名字
P a r e n t F o l d e r 返回该文件夹的父文件夹对应的 F o l d e r对象
P a t h 返回文件夹的绝对路径,使用相应的长文件名
S h o r t N a m e 返回 D O S风格的 8,3形式的的文件夹名
S h o r t P a t h 返回 D O S风格的 8,3形式的文件夹的绝对路径
S i z e 返回包含在该文件夹里所有文件和子文件夹的大小
S u b F o l d e r s 返回该文件夹内包含的所有子文件夹对应的 F o l d e r s集合,包括隐藏文件夹和系统文件夹
Ty p e 如果可能,返回一个文件夹类型的说明字符串 (例如,,Recycle Bin” )
(2) Folder对象的方法
F o l d e r对象提供一组可用于复制、删除和移动当前文件夹的方法。这些方法的运行方式与
F i l e S y s t e m O b j e c t对象的 C o p y F o l d e r,D e l e t e F o l d e r和 M o v e F o l d e r方法相同,但这些方法不要求 s o u rc e参数,因为源文件就是这个文件夹。这些方法及说明如表 5 - 1 0所示。
在文件夹之间可以使用当前文件夹的 P a r e n t F o l d e r属性,返回到父目录。当到达一个文件夹时,如果 I s R o o t F o l d e r属性是 Tr u e,就停下来。离开驱动器的根目录,沿目录树向下,可遍历或访问在 F o l d e r s集合 (由当前文件夹的 S u b F o l d e r s属性返回 )内的指定文件夹。
第 5章 脚本运行期库对象 计计 155下载表 5-10 Folder对象的方法及说明方 法 说 明
C o p y (d e s t i n a t i o n,o v e rw r i t e) 将这个文件夹及所有的内容复制到 d e s t i n a t i o n指定的文件夹。如果 d e s t i n a t i o n
的末尾是路径分隔符 ( ' \ ' ),那么认为 d e s t i n a t i o n是放置拷贝文件夹的一个文件夹。否则认为 d e s t i n a t i o n是要创建的新文件夹的路径和名字。如果目标文件夹已经存在且 o v e rw r i t e参数设置为 F a l s e,将产生错误,缺省的 o v e rw r i t e
参数是 Tr u e
Delete (f o rc e) 删除文件夹及里面的所有内容。如果可选的 f o rc e参数设置为 Tr u e,即使文件夹设置为只读或含有只读的文件,也将删除该文件夹。缺省的 f o rc e是 F a l s e
M o v e (d e s t i n a t i o n) 将文件夹及里面所有的的内容移动到 d e s t i n a t i o n指定的文件夹。如果 d e s t i n a t i o n
的末尾是路径分隔符 ( ' \ ' ),那么认为 d e s t i n a t i o n是放置移动文件夹的一个文件夹。否则认为 d e s t i n a t i o n是一个新的文件夹的路径和名字。如果目标文件夹已经存在,则出错
C r e a t e TextFile 用指定的文件名在文件夹内创建一个新的文本文件,并且返回一个相
(f i l e n a m e,o v e rw r i t e,unicode ) 应的 Te x t S t re a m对象。如果可选的 o v e rw r i t e参数设置为 Tr u e,将覆盖任何已有的同名文件。缺省的 o v e rw r i t e参数是 F a l s e。如果可选的 u n i c o d e参数设置为 Tr u e,文件的内容将存储为 u n i c o d e文本。缺省的 u n i c o d e是 F a l s e
下列程序遍历了驱动器 C根目录内的所有文件夹,并显示各个文件夹的有关信息。
V B S c r i p t程序如下:
J S c r i p t程序如下:
156计计 ASP 3 高级编程 下载该 V B S c r i p t程序在服务器上运行时的结果如图 5 - 1 2所示。该页面为 f o l d e r s c o l l e c t i o n _
v b,a s p,来自本书提供的示例文件。
图 5-12 Folders集合的内容
(3) 使用特殊文件夹
G e t S p e c i a l F o l d e r是 F i l e S y s t e m O b j e c t对象的方法之一,它返回计算机上三个“特殊文件夹”
对应的 F o l d e r对象:
Wi n d o w s F o l d e r,% Wi n d o w s %目录,缺省为 WinNT (或 Wi n d o w s,在非 N T / 2 0 0 0的计算机上。 )目录
S y s t e m F o l d e r,% S y s t e m %目录,缺省为 WinNT\System32 (或 Wi n d o w s \ S y s t e m,在非
N T / 2 0 0 0计算机上 )目录。
Te m p o r a r y F o l d e r,% Te m p %目录,缺省为 Wi n N T \ Temp (或 Wi n d o w s \ Temp,在非 N T / 2 0 0 0
计算机上 )目录。
为得到对特殊文件夹的引用,我们提供相应的预定义常数作为 G e t S p e c i a l F o l d e r方法的参数:
第 5章 脚本运行期库对象 计计 157下载或用 J S c r i p t:
该 V B S c r i p t程序在服务器上运行时的结果如图 5 - 1 3所示。 该页面名为 s p e c i a l f o l d e r _ v b,a s p,
来自本书提供的示例文件。
图 5-13 GetSpecialFolder方法的使用结果
4,File对象
F i l e对象提供了对文件的属性的访问,通过它的方法能够对文件进行操作。每个 F o l d e r对象 提 供了 一 个 F i l e s 集合,包 含文 件 夹中 文 件对 应 的 F i l e对 象 。还 可 以直 接 地从
F i l e S y s t e m O b j e c t对象中通过使用 G e t F i l e方法得到一个 F i l e对象引用。
(1) File对象的属性
F i l e对象有一系列的属性,类似于 F o l d e r对象的属性,如表 5 - 11所示。
(2) File对象的方法
158计计 ASP 3 高级编程 下载表 5 - 11 File对象的属性及说明属 性 说 明
A t t r i b u t e s 返回文件的属性。可以是下列值中的一个或其组合,N o r m a l ( 0 ),R e a d O n l y( 1 )、
H i d d e n ( 2 ),S y s t e m ( 4 ),v o l u m e (名称 ) ( 8 ),Directory (文件夹 ) (16),A r c h i v e ( 3 2 )、
A l i a s ( 6 4 )和 compressed (128 )
D a t e C r e a t e d 返回该文件的创建日期和时间
D a t e L a s t A c c e s s e d 返回最后一次访问该文件的日期和时间
D a t e L a s t M o d i f i e d 返回最后一次修改该文件的日期和时间
D r i v e 返回该文件所在的驱动器的 D r i v e对象
N a m e 设定或返回文件的名字
P a r e n t F o l d e r 返回该文件的父文件夹的 F o l d e r对象。
P a t h 返回文件的绝对路径,可使用长文件名。
S h o r t N a m e 返回 D O S风格的 8,3形式的文件名
S h o r t P a t h 返回 D O S风格的 8,3形式的文件绝对路径
S i z e 返回该文件的大小 (字节 )
Ty p e 如果可能,返回一个文件类型的说明字符串 (例如:,Text Document”表示,t x t文件 )
同样类似于 F o l d e r对象,F i l e对象的方法允许复制、删除以及移动文件。它也有一个使用文本流打开文件的方法。 F i l e对象的方法及说明如表 5 - 1 2所示。
表 5-12 File对象的方法及说明方 法 说 明
C o p y (destination,overw r i t e) 将这个文件复制到 d e s t i n a t i o n指定的文件夹。如果 d e s t i n a t i o n的末尾是路径分隔符 ( ' \ ' ),那么认为 d e s t i n a t i o n是放置拷贝文件的文件夹。否则认为
d e s t i n a t i o n是要创建的新文件的路径和名字。如果目标文件夹已经存在且
o v e rw r i t e参数设置为 F a l s e,将产生错误,缺省的 o v e rw r i t e参数是 Tr u e
Delete (f o rc e) 删除这个文件。如果可选择的 f o rc e参数设置为 Tr u e,文件即使具有只读属性也会被删除。缺省的 f o rc e是 F a l s e
Move ( ) 将文件移动到 d e s t i n a t i o n指定的文件夹。如果 d e s t i n a t i o n的末尾是路径分隔符 ( ' \ ' ),那么认为 d e s t i n a t i o n是一文件夹。否则认为 d e s t i n a t i o n是一个新的文件的路径和名字。如果目标文件夹已经存在,则出错
C r e a t e Te x t F i l e 用指定的文件名创建一个新的文本文件,并且返回一个相应的 Te x t S t r e a m
(filename,overwrite,unicode) 对象。如果可选的 o v e rw r i t e参数设置为 Tr u e,将覆盖已有的同名文件。缺省的 o v e rw r i t e参数是 F a l s e,。如果可选的 u n i c o d e参数设置为 Tr u e,文件的内容将存储为 u n i c o d e文本。缺省的 u n i c o d e是 F a l s e
O p e n A s TextStream 打开指定文件并且返回一个 Te x t S t r e a m对象,用于文件的读、写或追加。
(iomode,format) i o m o d e参数指定了要求的访问类型,允许值是 F o r R e a d i n g ( 1 ) (缺省值 )、
F o r Wr i t i n g ( 2 ),F o r A p p e n d i n g ( 8 )。 f o r m a t参数说明了读、写文件的数据格式。
允许值是 Tr i s t a t e F a l s e ( 0 ) (缺省 ),说明用 A S C I I数据格式 ; Tr i s t a t e Tr u e ( - 1 )说明用 U n i c o d e数据格式 ; TristateUseDefault (-2 )说明使用系统缺省的格式因此给定一个 F i l e对象后,可以使用 P a r e n t F o l d e r属性得到包含该文件的 F o l d e r对象的引用,
用来在文件系统中导航。甚至可以用 D r i v e属性获得相应的 D r i v e对象的引用,并得到各种
F o l d e r对象以及所包含的 F i l e对象。
另外,给定一个 F o l d e r对象以及对应的 F i l e s集合后,可以通过遍历该集合检查这一文件夹中的每个文件。还可以使用 F i l e对象的各种方法以一定方式处理该文件,如复制、移动或删除。
下面的代码给出了 C驱动器的第一个文件夹的文件列表:
第 5章 脚本运行期库对象 计计 159下载注意,不能使用数字索引来定位 F o l d e r s或 F i l e s集合里的条目,因此必须使用 F o r
Each..,Next 语句遍历该集合直到最初的条目,然后使用该条目的 N a m e属性。也不得不使用嵌套的圆括号强迫其作为值 (字符串 )传送给该 F o l d e r s集合的 I t e m方法。
用下面的 J S c r i p t程序可完成同样的工作:
160计计 ASP 3 高级编程 下载两个程序的结果是相同的,如图 5 - 1 4所示。该页面为 f i l e s c o l l e c t i o n _ v b,a s p,来自本书提供的示例文件。
图 5-14 File集合的内容在 C驱动器上的第一个文件夹可能是 C A C o n f i g,缺省情况下该文件夹是空的。这种情况下,可先向该文件夹复制一些文件,完成实验以后再删除这些文件。
5.5 Scripting.Te x t S t r e a m对象
F i l e S y s t e m O b j e c t,F o l d e r和 F i l e对象的一些方法都与通过 Te x t S t r e a m对象创建、读取或写入文本文件有关。
虽然 Te x t S t r e a m对象定义为 F i l e S y s t e m O b j e c t对象的一个独立的附属对象,但我们不得不使用 F i l e S y s t e m O b j e c t对象或其附属对象来创建一个 Te x t S t r e a m对象并访问磁盘文件的内容。
5.5.1 创建 Te x t S t r e a m对象的方法有三个常用方法用于创建或打开一个文本文件并返回 Te x t S t r a m对象,如表 5 - 1 3所示。
表 5-13 创建 Te x t S t r e a m对象的方法及说明方 法 说 明
C r e a t e TextFile 在磁盘上用指定的文件名 f i l e n a m e创建一个新文本文件,并返回一个与该文件
(filename,overwrite,unicode) 对应的 Te x t S t r e a m对象。如果可选的 o v e rw r i t e参数设置为 Tr u e,将覆盖具有同样路径的同名文件。缺省的 o v e rw r i t e是 F a l s e。如果可选的 u n i c o d e参数设置为 F a l s e,
该文件的内容将存储为 u n i c o d e格式。缺省的 u n i c o d e是 F a l s e
O p e n Te x t F i l e 打开或创建 (如果不存在 )一个名为 f i l e n a m e的文件,并且返回与该文件对应的
(filename,iomode,c reate,format) Te x t S t r e a m对象。 f i l e n a m e参数可以包含绝对或相对路径。 i o m o d e参数说明需要的访问类型。容许值是 F o r R e a d i n g ( 1 ) (缺省 ),F o r Wr i t i n g ( 2 ),F o r A p p e n d i n g ( 8 )。
写入或追加到一个不存在的文件时,如果 c re a t e参数设置为 Tr u e,将创建一个新文件。缺省的 c re a t e是 F a l s e。 f o r m a t参数说明了读或写文件时的数据格式。容许值是 Tr i s t a t e F a l s e ( 0 ) (缺省 ),说明用 A S C I I数据格式 ; Tr i s t a t e True (-1)说明用
U n i c o d e数据格式 ; TristateUseDefault (-2)说明使用系统缺省的格式
O p e n A s TextStream 打开一个指定的文件并且返回一个 TextStream对象,可用于对该文件的读、写或
(iomode,format) 追加。 i o m o d e参数说明了需要的访问类型。容许值是 F o r R e a d i n g ( 1 ) (缺省 )、
F o r Wr i t i n g ( 2 ),ForAppending(8 )。 f o r m a t参数说明了读写文件的数据格式。容许值是 Tr i s t a t e F a l s e ( 0 ) (缺省 ),说明用 A S C I I数据格式 ; Tr i s t a t e True (-1)说明用
U n i c o d e数据格式 ; TristateUseDefault (-2)说明使用系统缺省的格式第 5章 脚本运行期库对象 计计 161下载上面列出的方法在 F i l e S y s t e m O b j e c t,F o l d e r和 F i l e对象中的实现有所不同。如表 5 - 1 4所示。
表 5-14 三个对象中包含的方法方 法 F i l e S y s t e m O b j e c t对象 F o l d e r对象 F i l e对象
C r e a t e Te x t F i l e 有 有 有
O p e n Te x t F i l e 有 无 无
O p e n A s Te x t S t r e a m 无 无 有因此,可以使用这些方法创建一个新的文本文件,或者打开一个已存在的文件。则可得到与该文件相应的一个 Te x t S t r e a m对象,可以使用 Te x t S r e a m对象的属性和方法操作文件。
1,创建新的文本文件可以用 C r e a t e Te x t F i l e方法创建新的文本文件,或覆盖一个已存在的文件。返回的
Te x t S t r e a m对象可用来读写文件。
首先创建一个 F i l e S y s t e m O b j e c t对象,用来创建 Te x t S t r e a m对象。下面这个例子是用
V B S c r i p t创建一个“普通的” (即非 Unicode )名为 M y F i l e,t x t的文件,并覆盖已存在的同名文件:
这同样可用 J S c r i p t实现:
一旦创建了该文件,就可以使用 o b j T S t r e a m (它是对一个 Te x t S t r e a m对象的引用 )对文件进行操作。
2,打开已存在的文本文件
O p e n Te x t F i l e方法用于打开一个已有的文本文件。它返回一个 Te x t S t r e a m对象,可用这个对象对文件读或追加数据。
同样,首先创建一个 F i l e S y s t e m O b j e t对象,然后用其创建一个 Te x t S t r e a m对象。下面的
V B S c r i p t程序例子打开一个名为 M y F i l e,t x t的文件,准备读出其内容:
用 J S c r i p t:
为了写入一个文件或创建一个不存在的文件,可以用以下代码:
如果要打开一个已有的 U n i c o d e文件,准备对其追加数据,但是不创建不存在的文件,可以用:
162计计 ASP 3 高级编程 下载
3,作为一个 Te x t S t r e a m对象打开一个 F i l e对象可用 F i l e对象的 O p e n A s Te x t S t r e a m方法打开与该对象相应的文件,并且返回一个能对该文件进行读、写和追加的 Te x t S t r e a m对象。所以,给定一个 F i l e对象 (这种情况下不是
F i l e S y s t e m O b j e c t对象 )— o b j F i l e O b j e c t,可作为一个“普通的” (非 Unicod) Te x t S t r e a m对象打开它,以供追加文件内容:
注意,使用这种方法不需要文件名,因为程序的执行通过引用 F i l e对象进行,并且没有
c r e a t e 参数,因为该文件必须已存在。如果想从一个新的空的文件开始,可以用:
如果想读取该文件:
5.5.2 Te x t S t r e a m对象成员概要表 5 - 1 5和表 5 - 1 6是 Te x t S t r e a m对象的全部属性和方法的列表。下面将简短介绍各个重要的成员的细节。
1,Te x t S t r e a m对象的属性
Te x t S t r e a m的属性提供有关文件内文件指针当前位置的信息,如表 5 - 1 5所示。注意,所有的属性是只读的。
表 5-15 Te x t S t r e a m对象的属性及说明属 性 说 明
A t E n d O f L i n e 如果文件位置指针在文件中一行的末尾则返回 Tr u e
A t E n d O f S t r e a m 如果文件位置指针在文件的末尾则返回 Tr u e
C o l u m n 从 1开始返回文件中当前字符的列号
L i n e 从 1开始返回文件中当前行的行号第 5章 脚本运行期库对象 计计 163下载
A t E n d O f L i n e和 A t E n d O f S t r e a m属性仅对以 i o m o d e参数为 F o r R e a d i n g的方式打开的文件可用,否则将会出错。
2,Te x t S t r e a m对象的方法
Te x t S t r e a m对象的方法如表 5 - 1 6所示。
表 5-16 Te x t S t r e a m对象的方法及说明属 性 说 明
Close ( ) 关闭一个打开的文件
R e a d (n u m c h a r s) 从文件中读出 n u m c h a r s个字符
ReadAll ( ) 作为单个字符串读出整个文件
ReadLine ( ) 作为一个字符串从文件中读出一行 (直到回车符和换行 )
Skip ( n u m c h a r s) 当从文件读出时忽略 n u m c h a r s个字符
SkipLine ( ) 当从文件读出时忽略下一行
Write ( string ) 向文件写入字符串 s t r i n g
WriteLine ( string ) 向文件写入字符串 string (可选 )和换行符
WriteBlankLines ( n ) 向文件写入 n个换行符
3,写文本文件一旦使用 C r e a t e Te x t F i l e,O p e n Te x t F i l e或 O p e n A s Te x t S t r e a m方法以及 F o r Wr i t i n g或
F o r A p p e n d i n g参数,创建一个对应于某个文件的 Te x t S t r e a m对象,可以用下面的 V B S c r i p t程序写文件和关闭文件:
或者用 J S c r i p t,
4,读文本文件一旦使用 C r e a t e Te x t F i l e,O p e n Te x t F i l e或 O p e n A s Te x t S t r e a m方法以及 F o r R e a d i n g参数,创建一个对应于某个文件的 Te x t S t r e a m对象,可以用下面的 V B S c r i p t程序读文件和关闭文件:
164计计 ASP 3 高级编程 下载或用 J S c r i p t:
5.5.3 Te x t S t r e a m对象举例为了了解使用 Te x t S t r e a m对象操作文本文件的几种方式,本书提供了一个 V B S c r i p t示例页面,该页使用了大量的上述的代码。从示例的 C h a p t e r 0 5主菜单页,选择链接,Working Wi t h
the TextStream Object”打开 show _textstream.asp页面。
该页显示了存储在磁盘上名为 M y F i l e,t x t的文件的文本内容。在 < T E X TA R E A >控件里显示的文本内容允许进行编辑,并且下面有三个按钮。三个按钮的作用分别是用 < T E X TA R E A >控件的内容更新 (即取代 )最初的文本,在已有文件内容的后面添加文本,或用初始的缺省内容重写文件,如图 5 - 1 5所示。
图 5-15 Te x t S t r e a m对象示例页面第 5章 脚本运行期库对象 计计 165下载
1,读取已存在的文本文件的内容每次载入该页面,将打开文本文件并将读取的内容置入 < T E X TA R E A >控件。注意我们如何使用 S e r v e r,M a p P a t h方法得到文件 M y F i l e,t x t的绝对物理路径,该文件与示例页面在同一目录下。下面的程序创建 F i l e S y s t e m O b j e c t实例:
与书中本部分的大多数其他示例一样,该页包含一个 < F O R M >段以保存该页面的 H T M L
控件。 A C T I O N是当前页面,因此窗体的内容送回到同一页面。
每次载入该页面,< T E X TA R E A >控件用文本文件的当前内容填充:
由上面程序可知道如何打开文本文件进行读取,遍历整个文件每次读取一行 (而不是作为一个字符串读出整个文件 )。这是因为要添加自己的行号,行号不属于该文件的文本。对从该文件读出的每行 (读之前 ),检索并且格式化 L i n e属性并创建一个三位数字的行号。然后把行编号和文本行放置页面的 < T E X TA R E A >控件内。
2,更新文本文件的内容当点击页面的 U p d a t e按钮时(一般是在编辑了 < T E X TA R E A >控件里的文本以后),将把
< T E X TA R E A >控件里的内容重新写入到该文本文件内。为此,该页有相应的一些 A S P代码,
在创建 H T M L控件以前检验 R e q u e s t,F o r m集合,查看点击的是那一个按钮 (如果有的话 ),然后就重新载入该页。
如果点击 U p d a t e按钮,搜集 < T E X TA R E A >控件的内容作为一个字符串,分离这个字符串使之成为独立文本行的数组,并且打开文本文件准备重写其内容,然后遍历刚刚创建的数组,
按行号循环写入该行的内容:
166计计 ASP 3 高级编程 下载
H T M L < T E X TA R E A >控件可在返回的 Va l u e中增加额外字符,这依赖于原始
H T M L页内的内容格式和 W R A P属性的设置。特别是应在 A S P脚本结束定界符,% >”
后立即写上 < / T E X TA R E A >标记,以防止增加一个额外的回车符号。即使用:
而不使用:
3,向文本文件追加内容当点击 A p p e n d按钮时,可对已有的文件追加内容,与修改该文件内容类似,如图 5 - 1 6所示。区别是打开该文件是为了追加而不是为了改写文件。调用 O p e n Te x t F i l e方法时可增加额外参数,防止在指定的文件不存在时创建新文件。
图 5-16 向文本文件追加内容时的示例页面第 5章 脚本运行期库对象 计计 167下载
4,重写缺省内容最后,R e s t o r e按钮用来将初始缺省内容简单地重写回文本文件。代码与用 Te x t S t r e a m的方法写一个文本文件类似:
5.6 小结本章讲述了在 A S P页面中使用对象和组件的强大能力。首先讨论对象和组件的一般特性,
以及它们的类型。然后集中论述了如何在 A S P (及客户端 )脚本代码序内创建对象实例。
在页面上使用的许多对象可能都是“外部”组件,这些组件安装在服务器上,独立于
A S P。本章所讨论的对象,当 A S P使用一种缺省的脚本语言(如 V B S c r i p t或 J S c r i p t )时,总是可用的。其实现是通过 s c r r u n,d l l文件里的脚本运行期库完成的。
这些对象是指 D i c t o n a r y对象,F i l e S y s t e m O b j e c t对象和 Te x t S t r e a m对象。
D i c t i o n a r y对象为我们提供了存储值的一种有效方式,可根据名字进行索引和访问,而不是根据一个数字索引进行访问。这是存储名字 /值对这样的数据的理想方式。
F i l e S y s t e m O b j e c t对象和 Te x t S t r e a m对象相互之间联系密切,可使用它们访问服务器或网络 (映射 )的磁盘驱动器的目录。 F i l e S y s t e m O b j e c t对象提供对驱动器、文件夹 (目录 )和文件的存取,并提供了用于对于获得更多的信息或移动、复制、删除它们的属性及方法。
可以创建对应于系统内的任何文件的 Te x t S t r e a m对象,并通过该对象对文件进行读取和写入。对于读写过程它作为文本文件操作,甚至可以处理 U n i c o d e格式的文件。对文件系统的导航和读写能力的结合允许对服务器文件系统进行极其复杂的控制。还可以在客户端脚本代码中使用对象 (有一定限制 )。
本章讨论的主要内容为:
脚本引擎以什么方式提供脚本对象。
如何创建脚本对象及其他组件的实例。
脚本对象的成员和特性概要。
如何在代码中使用脚本对象。
下一章将把注意力从脚本运行期库对象转移到可以在 A S P页面中使用的其他组件,包括由 I I S / A S P提供的可安装组件和在其他任何地方得到的组件。
168计计 ASP 3 高级编程 下载