rpc—这个web方法使用rpc(远程过程调用)风格的调用。
使用这种绑定风格,SOAP消息被格式化为具有多个部分的消息。
在SOAP消息中,元素包含一个子元素,其名称取自相应的操作名称。这个元素是一个生成的包装元素,它为方法的参数列表中的每个参数包含一个子元素。
重要提示:对于手动创建的web服务,该关键字的默认值通常是合适的。
rpc —这个web方法使用rpc(远程过程调用)风格的调用。使用这种绑定风格,SOAP消息被格式化为具有多个部分的消息。
在SOAP消息中,元素包含一个子元素,其名称取自相应的操作名称。这个元素是一个生成的包装元素,它为方法的参数列表中的每个参数包含一个子元素。
重要提示:对于手动创建的web服务,该关键字的默认值通常是合适的。
指定用户或进程调用此方法必须拥有的权限列表。
要指定此方法应限于具有指定权限的用户或进程,请使用以下语法:
Method name(formal_spec) As returnclass [ Requires = privilegelist ]
{ //implementation }
其中,privilegelist 要么是单个特权,要么是用引号括起来的以逗号分隔的特权列表。
每个权限都采用resource:permission的形式,其中permission是Use、Read或Write(或单字母缩写U、R或W)。
若要为一个资源resource指定多个权限,请使用单字母缩写。
用户或进程必须拥有权限列表中的所有权限才能调用该方法。
调用没有指定权限的方法会导致错误。
如果方法从超类继承了Requires关键字,则可以通过设置关键字的新值将其添加到所需特权的列表中。
不能以这种方式删除所需的特权。
如果忽略此关键字,则调用此方法不需要特殊权限。
下面的方法需要对Sales数据库的读权限和对Marketing数据库的写权限。
(注意,如果一个数据库有写权限,它会自动有读权限。
指定此方法在为类生成的例程中相对于其他方法的顺序。
要指定类编译器应该将此方法放在它为类创建的例程中列出的方法之后,请使用以下语法:
Method name(formal_spec) As returnclass [ PlaceAfter = methodlist ]
{ //implementation }
其中methodlist是单个方法名或用逗号分隔的方法名列表,用括号括起来。
此关键字指定类编译器应该将此方法放在它为类创建的例程中列出的方法之后。此关键字用于极少数需要控制类编译器为方法生成代码的顺序的情况。
如果省略此关键字,类编译器将使用其正常逻辑来确定它生成的例程中方法的顺序。
指定此方法是否为私有方法(只能由该类或其子类的方法调用)。
要指定该方法为私有方法,请使用以下语法:
Method name(formal_spec) As returnclass [ Private ]
{ //implementation }
否则,请省略此关键字或将该词放在该关键字之前。
私有类成员只能由同一类(或其子类)的其他成员使用。请注意,其他语言经常使用protected这个词来描述这种可见性,使用private这个词来表示不可见子类。
可以使用%SYS.Journal.File类中的ByTimeReverseOrder查询,以及%SYS.Journal.Record类中的List查询来实现。
下面是这两个查询的具体作用:
A) %SYS.Journal.File类中的ByTimeReverseOrder查询
这个查询会获取journal日志文件名并按降序排列
USER>set rs=##class(%ResultSet).%New("%SYS.Journal.File:ByTimeReverseOrder")
USER>do rs.Execute()
USER>while rs.Next() { write rs.Name,! }
c:\intersystems\cache\mgr\journal\20190620.003
c:\intersystems\cache\mgr\journal\20190620.002
c:\intersystems\cache\mgr\journal\20190620.001
c:\intersystems\cache\mgr\journal\20190610.001B) %SYS.Journal.Record类中的List查询
这个查询可以从指定journal日志文件中获取日志记录
USER>set rs2=##class(%ResultSet).
指定何时生成此方法。仅当方法是方法生成器时适用。
要指定在生成其他方法后调用此方法的生成器,请使用以下语法:
Method name(formal_spec) As returnclass [ CodeMode = ObjectGenerator, GenerateAfter = methodlist ]
{ //implementation }
其中methodlist是单个方法名或用逗号分隔的方法名列表,用括号括起来。
在方法生成器方法的情况下,指定生成器应在生成列出的方法后调用。当需要控制方法生成器的调用顺序时,此关键字非常有用。
指定此方法定义是否是内部的(不显示在类文档中)。
要指定此方法是内部的,请使用以下语法:
Method name(formal_spec) As returnclass [ Internal ]
{ //implementation }
否则,省略此关键字或将单词Not放在关键字的前面。
内部类成员不会显示在类文档中。如果想让用户看到一个类,但不看到它的所有成员,这个关键字很有用。
指定用于实现此方法的语言。
指定不推荐使用此方法。该关键字被类编译器忽略,只是提供了一个人类可读的指示符,表明该方法已被弃用。
要指定不推荐使用此方法,请使用以下语法:
Method name(formal_spec) As returnclass [ Deprecated ]
{ //implementation }
否则,省略此关键字或将单词Not放在关键字的前面。
当此方法在外部数据库中用作存储过程时,指定其名称。仅当方法被投影为存储过程时适用。
若要在方法用作外部数据库中的存储过程时重写该方法的默认名称,请使用以下语法:
ClassMethod name(formal_spec) As returnclass [ SqlProc, ExternalProcName = MyProcedure ]
{ //implementation }
其中MyProcedure是一个不带引号的字符串。
当此方法在外部数据库中用作存储过程时,此关键字允许定义此方法的名称。
如果省略此关键字,方法名将用作存储过程名
指定此方法是否为最终方法(不能在子类中重写)。
指定索引是否应强制唯一性。
要指定IRIS应强制此索引所基于的属性具有唯一性,请使用以下语法:
Index name On property_expression_list [ Unique ];
否则,请省略此关键字或将该词放在该关键字之前。
如果存在UNIQUE关键字,则表示这是唯一索引。
由唯一索引索引的属性(或多个属性)被约束为在定义索引的类(表)的范围(所有对象的集合)内具有唯一值(即,没有两个实例可以具有相同的排序值)。
唯一索引不能也是位图索引。
Index SSNIdx On SSN [ Unique ] ;
如果省略此关键字,IRIS不会强制此索引所基于的属性具有唯一性。
指定这是否是抽象方法。
要指定此方法是抽象的,请使用以下语法:
Method name(formal_spec) As returnclass [ Abstract ] { //implementation }
否则,省略此关键字或将单词Not放在关键字的前面。
抽象方法没有实现,也没有为其生成的可执行代码。抽象方法的存在仅仅是为了定义一个可以在一个或多个子类中被覆盖和实现的方法签名(或接口)。抽象方法的一些例子是在 IRIS类库中定义的但没有实现的各种回调方法。
指定此索引是否定义表的主键。
要指定该表的主键由该索引所基于的属性构成,请使用以下语法:
Index name On property_expression_list [ PrimaryKey ];
否则,省略此关键字或将单词Not放在关键字的前面。
此关键字指定应通过SQL将此索引报告为此类(表)的主键。
PrimaryKey索引的行为也类似于唯一索引。
也就是说,对于在此索引中使用的属性(或属性组合),InterSystems IRIS强制唯一性。
在这个索引定义中,允许将Unique关键字指定为true,但这是多余的。
Index EmpIDX On EmployeeID [ PrimaryKey] ;
如果忽略此关键字,则该表的主键不是由索引所基于的属性构成的。
指定这个类的分片键。
在分片类完全实现之前,InterSystems建议从SQL创建分片表,而不是从对象端。
但是,如果你查看一个通过创建一个分片表生成的类,你可能会看到如下代码:
/// ShardKey分片表索引,由DDL CREATE table语句自动生成
Index ShardKey On DeptNum [ Abstract, CoshardWith = User.指定其值将存储在此索引中的属性列表。
要在索引, 中存储属性值,请使用以下语法:
Index name On property_expression_list [ Data = stored_property_list ];
其中,stored_property_list 是单个属性名称或括号中以逗号分隔的属性 , 列表。
此关键字指定属性列表,其值将存储在此索引中。
不能将此关键字与位图索引一起使用。
如果省略此关键字,属性值将不会存储在索引中。
Index NameIDX On Name [ Data = Name ];
Index ZipIDX On ZipCode [ Data = (City,State) ];
定义范围索引。
要指定这是范围索引,请使用以下语法:
Index State [ Extent ];
否则,省略此关键字或将单词Not放在关键字的前面。
注意:如果使用位图索引,则会自动维护一个范围索引,无需定义。
extent index范围索引用于跟踪哪些对象实例属于某个子类。
范围关键字的默认值为假。
指定此索引是否定义表的对象标识值。
为外键指定一个SQL别名。
要覆盖此外键的默认SQL名称,请使用以下语法:
ForeignKey keyname(key_props) References pkg.class(ref_index) [ SqlName = alternate_name ];
其中备用名是一个SQL标识符。
此关键字允许在通过SQL引用时定义此外键的替代名称。
如果省略此关键字,外键的SQL名称就是外键定义中指定的keyname。
指定索引是抽象的。
要指定索引是抽象的,请使用以下语法:
Index MyIndex [ Abstract ];
注意:创建分片表时,会自动生成一个抽象分片键索引,无需定义。
抽象索引仅用于分片表。它们不包含数据,因此没有存储(没有全局索引)。分片表只有一个抽象索引,称为分片键索引。分片键索引的目的是作为决定行所在分片的键。
如果索引被定义为抽象的,则不能通过方法或SQL访问或使用该索引。如果将此索引标记为唯一的,或者尝试在主键中使用它,这些约束将被忽略。
不能将IdKey索引定义为抽象索引。如果这样做,将会导致类编译错误。
可以在现有索引上使用此关键字,使其变得抽象。这不会删除索引中的任何现有数据。
抽象关键字的默认值为false。
指定此外键定义是否为内部定义(不显示在类文档中)。
要将此外键定义标记为内部,请使用以下语法:
ForeignKey keyname(key_props) References pkg.class(ref_index) [ Internal ];
否则,省略此关键字或将单词Not放在关键字的前面。
内部类成员不会显示在类文档中。如果想让用户看到一个类,但不看到它的所有成员,这个关键字很有用。
如果省略此关键字,此外键定义将显示在类文档中。
指定是否应该检查这个外键约束。
要防止检查该外键定义的约束,请使用以下语法:
ForeignKey keyname(key_props) References pkg.class(ref_index) [ NoCheck ];
否则,省略此关键字或将单词Not放在关键字的前面。
NoCheck关键字禁止检查外键约束(换句话说,它指定外键约束永远不被检查)。
如果省略这个关键字,会检查外键约束。
指定当外部表中删除的记录被当前表中的记录引用时,此外部键应在当前表中引起的操作。
[toc]
指定此类投影到的SQL表的名称。仅适用于持久类。
要覆盖此类所投影到的SQL表的默认名称,请使用以下语法:
Class MyApp.Person Extends %Persistent [ SqlTableName = DBTable ] { //class members }
其中DBTable是有效的SQL标识符。
此关键字指定此类被投影到的SQL表的名称。默认情况下,SQL表名与类名相同。
通常,当类名是SQL保留字(并不少见)或希望SQL表包含类名不支持的字符(如“_”字符)时,可以使用此关键字。
此关键字不是继承的。
如果省略此关键字,类名将用作SQL表名。
[toc]
指定哪个存储定义控制此类的持久性。仅适用于持久类和串行类。
要指定该类使用的存储定义,请使用如下语法:
Class MyApp.MyClass Extends %Persistent [ StorageStrategy = MyStorage ]
{ //class members }
其中MyStorage是此类中存储定义的名称。
此关键字指定哪个存储定义用于定义此类使用的存储结构。
XML与WSDL中给出的模式完全匹配。
encoded 编码—默认情况下,此类中的web method使用SOAP编码的数据。也就是说,SOAP消息的中的XML使用了适合所使用的SOAP版本的SOAP编码,如以下规范所要求的:
SOAP 1.1 (https://www.w3.org/TR/2000/NOTE-SOAP-20000508/Opens in a new window)SOAP 1.2 (https://www.w3.org/TR/soap12-part2/Opens in a new window)重要提示:对于手动创建的web服务,该关键字的默认值通常是合适的。
向该类添加属性参数。
要向该类添加属性参数,请使用以下语法:
Class PropClass.MyClass Extends %RegisteredObject [ PropertyClass = PropClass.MyPropertyClass ] { //class members }
其中·propertyclasslist·是下列之一:
[ PropertyClass = PropClass.MyPropertyClass ]
如果需要添加自定义属性参数,请执行以下操作:
Class PropClass.MyPropertyClass
{
Parameter MYPARM As %String = "XYZ";
}
这些类参数在下一步中成为属性参数。
PropertyClass关键字。子类继承这个关键字添加的自定义行为。如果子类为关键字指定了一个值,则该值会指定一个或多个为该类的属性指定参数的附加类。
指定此类是否被投影到Java客户端。
要覆盖将类投影到Java客户端的默认方式,请使用以下语法:
Class Sample.# <center> 第二十五章 类关键字 - NoExtent
指定是否阻止编译器为此类生成继承类(如果不这样做的话)。
# 用法
要防止编译器为此类生成继承类,请使用以下语法:
```
Class MyApp.MyClass [ NoExtent ] { //class members }
```
否则,省略此关键字或将单词`Not`放在关键字的前面。
# 详解
如果该关键字为真,则该类没有 `extent`。不能创建此类的实例。通常,这样的类会扩展或覆盖从`%Library.Persistent`继承的标准持久接口。
# 对子类的影响
此关键字不是继承的。
# 默认
如果省略此关键字,类可以有一个`extent`。
# <center> 第二十六章 类关键字 - OdbcType
指定通过`ODBC`或`JDBC`公开此数据类型时使用的类型。每个数据类型类都必须指定一个`ODBC`类型。此关键字仅适用于数据类型类。
# 用法
要指定通过ODBC或JDBC投影此数据类型时要使用的类型,请使用以下语法:
```
Class MyApp.
# <center> 第二十一章 类关键字 - Hidden
指定此类是否隐藏(未在类引用中列出)。
# 用法
要隐藏类,请使用以下语法:
```java
Class MyApp.Person [ Hidden ] { //class members }
```
否则,省略此关键字或将单词Not放在关键字的前面。
# 详解
如果一个类是隐藏的,当使用Visual Studio代码的对象脚本扩展时,它不会在类引用中列出,也不会在studio检查器的工作区窗口中列出,也不会在对象脚本资源管理器窗格中列出。(但是,如果在“打开”对话框中键入该类的名称,或者在使用VS Code - ObjectScript时将其保存到本地工作区,仍然可以在Studio中打开该类。)
# 对子类的影响
此关键字不是继承的。
# 默认
如果省略此关键字,则该类不会被隐藏。
# <center> 第二十二章 类关键字 - Inheritance
指定此类的超类的继承顺序。
# 用法
要为此类的超类指定继承顺序,请使用以下语法:
```java
Class MyApp.
指定此类应在编译器使其他(指定的)类可运行后编译。
要指示类编译器应该在其他类可运行后编译此类,请使用以下语法:
Class MyApp.MyClass [ DependsOn = classlist ]
{ //class members }
其中classlist是下列之一:
[ DependsOn = MyApp.Class1 ]
[ DependsOn = (MyApp.Class1,MyApp.Class2,...) ]
此关键字指定类编译器应该在使指定的类可运行后编译此类。
如果此类的编译使用方法生成器逻辑中的这些其他类,则此关键字非常有用。如果类包含调用其他类的初始表达式,这也很有用。
此关键字仅影响编译顺序,不影响运行时行为。
注意:DependsOn关键字只影响具有System关键字的公共值的类。
此外,如果一个类有DependsOn=ClassA,那么它也有CompileAfter = ClassA也是多余的。
这个关键字继承自所有超类。如果子类为关键字指定了一个值,该值指定了在子类被编译之前必须运行的附加类。
默认情况下,不指定该关键字。
# <center> 第十三章 类关键字 - ClientDataType
指定将此数据类型投影到客户端技术时使用的客户端数据类型。仅适用于数据类型类。
# 用法
要指定将此数据类型投影到客户端技术时要使用的客户端数据类型,请使用以下语法:
```java
Class MyApp.MyString [ ClientDataType = clienttype ]
{ //class members }
```
其中clienttype是下列之一:
- `BIGINT`
- `BINARY`
- `BINARYSTREAM`
- `BOOLEAN`
- `CHARACTERSTREAM`
- `CURRENCY`
- `DATE`
- `DECIMAL`
- `DOUBLE`
- `FDATE`
- `FTIMESTAMP`
- `HANDLE`
- `INTEGER`
- `LIST`
- `LONGVARCHAR`
- `NUMERIC`
- `STATUS`
- `TIME`
- `TIMESTAMP`
- `VARCHAR` (默认)
# 详解
此关键字指定将此类投影到客户端技术时使用的客户端数据类型。每个数据类型类都必须指定一个客户端数据类型。
# 对子类的影响
这个关键字是从主超类继承的。子类可以覆盖关键字的值。
# 默认
默认的客户端数据类型是`VARCHAR`。
描述触发器定义的结构。
触发器是在SQL中发生特定事件时执行的代码段。InterSystems IRIS支持基于执行INSERT、UPDATE和DELETE命令的触发器。根据触发器定义,指定的代码将在相关命令执行之前或之后立即执行。每个事件可以有多个触发器,只要它们被分配了执行顺序。
可以向持久类添加触发器定义。它们在其他类中没有意义。
触发器定义具有以下结构:
/// description
Trigger name [ keyword_list ]
{ implementation }
description 描述(可选)旨在显示在“类参考”中。默认情况下,描述为空白。name(必需)是触发器的名称。这必须是有效的类成员名称,并且不能与任何其他类成员名称冲突。keyword_list(必需)是以逗号分隔的关键字列表,用于进一步定义触发器。implementation 实现(必需)是零行或多行ObjectScript代码,用于定义触发触发器时要执行的代码。描述参数定义的结构。
参数定义定义了一个给定类的所有对象都可用的常数值。创建类定义时(或在编译前的任何时候),可以设置其类参数的值。默认情况下,每个参数的值都是空字符串,但是可以在参数定义中指定一个非空值。在编译时,为类的所有实例建立参数值。除了极少数例外,该值不能在运行时更改。
参数定义具有以下结构:
/// description
Parameter name As parameter_type [ keyword_list ] = value ;
description描述(可选)旨在显示在“类参考”中。默认情况下,描述为空白。name(必需)是参数的名称。这必须是有效的类成员名称,并且不能与任何其他类成员名称冲突。parameter_type(可选)指定参数的用户界面类型,由Studio用于在检查器内为参数提供输入验证。这不是类名;参见下一节。在大多数情况下,编译器会忽略这个关键字。
如果省略参数类型,也要省略单词As
value(可选)指定参数的值。如果省略值,也要省略等号=keyword_list(可选)是以逗号分隔的关键字列表,用于进一步定义参数。如果省略此列表,也要省略方括号。
参数类型parameter_type 选项可以是下列值之一:
BOOLEAN — true(1)或false(0)值。
描述类定义的结构。
一个类可以包含熟悉的类元素,如属性、方法和参数(在其他类语言中称为常量)。它还可以包含通常不在类中定义的项,包括触发器、查询和索引。
类定义具有以下结构:
Import import_ppackage_list
Include include_code
IncludeGenerator include_generator_code
/// description
Class package.shortclassname Extends superclass_list [ class_keyword_list ]
{
Class_members
}
import_package_list(可选)指定类从中导入的任何包的名称。会影响编译器解析短类名的方式。如果指定了此选项,则它可以是单个包的名称,也可以是多个包的逗号分隔列表,用括号括起来。
如果import_package_list为空,则不要在类定义的开头添加import行。
注意:如果一个类导入任何包,该类不会自动导入用户包。
导入的包继承自所有超类。如果一个子类指定了一个或多个导入包,这些导入包将被添加到由超类定义的任何导入包中。
include_code(可选)指定 include (.inc)。编译此类时使用的文件。本例显示了一个使用本文前面介绍的几个%Library.File方法的样例类。
在示例类Demo.FileDemo中,ProcessFile()方法接受输入文件和输出文件,并调用SetUpInputFile()和SetUpOutputFile()打开文件,一个用于读取,另一个用于写入。然后,它逐行读取输入文件,并调用ProcessLine()对每行的内容执行一个或多个替换,将每行的新内容写入输出文件。
/// 设置输入文件
/// 1. 创建文件对象
/// 2. 打开文件阅读
/// 3. 返回文件对象的句柄
ClassMethod SetUpInputFile(filename As %String) As %File
{
Set fileObj = ##class(%File).%New(filename)
Set status = fileObj.Open("RU")
if $$$ISERR(status) {
do $system.Status.DisplayError(status)
quit $$$NULLOREF
}
quit fileObj
}
/// 设置输出文件
/// 1. 为文件创建目录结构
/// 2. 创建文件对象
/// 3.如果想要操作文件本身,需要使用%Library.File的%New()方法实例化%File对象。该类还提供了允许使用该文件的实例方法。
注意:本节提供了几个使用%File对象的示例,以供说明。
对于简单的文件读写,使用%Stream.FileCharacter和%Stream.FileBinary。因为它们提供了额外的功能,例如,以正确的模式自动打开文件。
要使用文件,需要使用%New()方法实例化表示该文件的%File对象。该文件可能已经存在,也可能不存在于磁盘上。
以下示例在默认目录中为文件export.xml实例化一个%File对象。
set fileObj = ##class(%File).%New("export.xml")
实例化%File对象后,需要使用open()方法打开文件,以读取或写入该文件:
USER>set status = fileObj.Open()
USER>write status
1
使用Close()方法关闭文件:
USER>do fileObj.Close()
一旦实例化了文件,就可以直接检查文件的属性。
USER>write fileObj.Name
export.xml
USER>write fileObj.%Library.File类提供了几个类方法,允许对文件执行各种操作。
若要复制文件,请使用CopyFile()方法,该方法返回一个布尔值来指示成功或失败。
此方法采用四个参数:
下面的第一个示例将目录e:\temp中的文件old.txt复制到new.txt。第二个示例将相同的文件复制到默认目录中的new.txt。
DHC-APP>write ##class(%File).CopyFile("e:\temp\old.txt", "e:\temp\new.txt", 0, .return)
1
DHC-APP>write ##class(%File).CopyFile("e:\temp\old.txt", "new.txt", 0, .return)
1
最后一个示例失败,Windows错误代码为2,或“找不到文件”
DHC-APP>write ##class(%File).CopyFile("foo.txt", "new.txt", 0, .%Library。File类提供了几个类方法,允许对目录执行各种操作。
若要创建目录,请使用CreateDirectory()方法,该方法返回一个布尔值来指示成功或失败。这个方法需要两个参数。第一个参数是要创建的目录的名称。第二个参数是输出参数。如果为负,它包含操作系统返回的错误代码,以防方法失败。
如果e:\temp已经存在,以下命令将失败,并显示Windows系统错误代码183,这意味着“当文件已经存在时,无法创建该文件。”
DHC-APP>write ##class(%File).CreateDirectory("e:\temp", .return)
0
DHC-APP>w return
-183
如果e:\temp已经存在,但e:\temp\test不存在,则以下命令会失败,因为CreateDirectory()最多创建给定目录路径中的最后一个目录。所以返回的Windows系统错误代码是3,或者“系统找不到指定的路径。”
DHC-APP>write ##class(%File).CreateDirectory("e:\temp\test\this", .return)
0
DHC-APP>w return
-183
以下示例使用Windows系统代码0或“操作成功完成”成功完成
DHC-APP>write ##class(%File).%Library.File类提供了几个可用于处理文件名和目录名的类方法。在大多数情况下,文件和目录不需要存在即可使用这些方法。
%Library.File类提供可用于获取部分文件名和目录名的类方法。
在给定完整路径名的情况下,使用GetDirectory()和GetFilename()分别获取目录和短文件名。对于此方法,不允许使用部分目录名。
DHC-APP>set filename = "e:\temp\config.txt"
DHC-APP>write ##class(%File).GetDirectory(filename)
E:\temp\
DHC-APP>write ##class(%File).GetFilename(filename)
config.txt
在给定文件名的情况下,使用CanonicalFilename()从根目录获取完整路径:
DHC-APP>set filename = "cache.dat"
DHC-APP>write ##class(%File).CanonicalFilename(filename)
e:\dthealth\db\dthis\data\cache.dat
DHC-APP>write ##class(%File).CanonicalFilename("foo.%Library.File类还提供了许多类方法,可以使用这些方法来获取有关文件和目录的信息,或者查看或设置它们的属性和属性。
要确定给定文件是否存在,请使用Existes()方法并指定文件名作为参数。例如:
DHC-APP>write ##class(%File).Exists("e:\temp\")
1
同样,要找出给定目录是否存在,请使用DirectoryExists()方法,并将该目录指定为参数。例如:
DHC-APP>write ##class(%File).DirectoryExists("e:\temp")
1
如前所述,这些方法在Unix上将文件或目录名视为区分大小写,但在Windows上不区分大小写。此外,如果指定部分文件名或目录名,则该方法引用的文件或目录相对于包含正在使用的命名空间的默认全局数据库的目录。例如:
DHC-APP>write ##class(%File).Exists("cache.dat")
1
%Library.File类提供了许多类方法,可以使用这些方法查看或设置文件或目录的权限。
给定文件或目录名,如果文件或目录是只读的,ReadOnly()方法返回1,否则返回0:
DHC-APP>write ##class(%File).%Library.File(简称%File)为处理文件和目录提供了广泛的API。本文将介绍该API的主要功能。有关属性、方法和查询的规范列表,请参见类参考。
注意:如果指定了部分文件名或目录名,这些方法中的大多数都引用的项相对于包含正在使用的命名空间的默认全局数据库的目录。该目录在本文中称为“默认目录”。这条规则的任何例外都在文章中注明。
此外,仅当基础操作系统将文件名和目录名视为区分大小写时,这些方法才会将文件名或目录名视为区分大小写。也就是说,文件或目录名在Unix上区分大小写,但在Windows上不区分大小写。
FileSet类查询列出目录的内容。此查询按顺序接受以下参数:
directory — 指定要检查的目录的名称。wildcards 通配符 — 指定要匹配的文件名模式(如果有)。sortby 排序依据 — 指定如何对结果进行排序。使用以下值之一:Name 名称—文件的名称(默认)Type 类型—项目类型DateCreated 创建日期—创建文件的日期和时间DateModified 日期修改—文件上次修改的日期和时间Size 大小—文件大小includedirs —指定如何处理给定目录中的目录。如果此参数为真(1),查询将返回任何文件之前的所有目录,并且目录名忽略通配符参数。以下形式的名值对:
ID="QD5690"
属性位于元素中,如下所示,一个元素可以有任意数量的属性。
<Patient ID="QD5690">Cromley,Marcia N.</Patient>
表示不应该验证的文本,如下所示:
<myelementname><![CDATA[
Non-validated data goes here.
You can even have stray "<" or ">" symbols in it.
]]></myelementname>
一个CDATA(字符数据)区段不能包含字符串]]>,因为这个字符串标志着区段的结束。
这也意味着CDATA区段不能嵌套。
注意,CDATA部分的内容必须符合为XML文档指定的编码,XML文档的其余部分也是如此。
不是XML文档主数据的一部分的插入说明。 注释是这样的:
<!--Output for the class: GXML.PersonNS7-->
对XML元素的可能内容的抽象描述。