文章目录

  • 第115章 Caché 函数大全 $ZSEARCH 函数
  • 大纲
    • 参数
  • 描述
    • 通配符
  • 参数
    • target
  • 示例
  • 注意
    • 目录锁定
    • Windows支持
    • UNIX®支持

 

 
第115章 Caché 函数大全 $ZSEARCH 函数

返回指定文件的完整文件规范,路径名和文件名。

大纲
$ZSEARCH(target)
$ZSE(target)

参数

  • target 文件名,路径名或空字符串。可能包含一个或多个*或?通配符。
描述

$ZSEARCH返回指定目标文件或目录的完整文件规范(路径名和文件名)。文件名可以包含通配符,以便$ZSEARCH可以返回满足通配符的一系列标准路径名。

注意:某些操作系统使用斜杠(/)字符作为目录路径分隔符。其他操作系统使用反斜杠(\)字符。在本说明中,单词“斜杠”表示斜杠或反斜杠(视情况而定)。

如果目标参数未指定路径名,$ZSEARCH将搜索当前工作目录。$ZSEARCH在其匹配过程中按以下顺序应用规则:

  1. $ZSEARCH扫描目标以查看其周围是否有百分比字符(%)。如果$ZSEARCH找到这样的文本,它会将该字符串视为环境变量。$ZSEARCH对字符串执行名称转换。
  2. $ZSEARCH扫描上一步产生的字符串以找到最后一个斜杠。如果$ZSEARCH找到最后一个斜杠,它将使用直到(但不包括)最后一个斜杠的字符串作为要搜索的路径或目录。如果$ZSEARCH没有找到最后一个斜杠,它将搜索由当前名称空间确定的当前工作目录。
  3. 如果$ZSEARCH在上一步中找到了最后一个斜杠,它将使用最后一个斜杠后面的目标字符串部分作为文件名搜索模式。如果$ZSEARCH在上一步中没有找到最后一个斜杠,它将使用步骤1产生的整个字符串作为文件名搜索模式。

文件名搜索模式可以是任何合法的文件名字符串或文件名通配符表达式。与搜索模式匹配的第一个文件名将作为$ZSEARCH函数值返回。哪个是第一个匹配的文件与平台相关(如注释部分所述)。

如果下一次调用$ZSEARCH时将空字符串指定为目标,则$ZSEARCH将继续前一个目标,并返回与搜索模式匹配的下一个文件名。当没有其他文件与搜索模式匹配时,$ZSEARCH将返回空字符串。

%Library.File类的NormalizeDirectory()方法也可用于返回指定文件或目录的完整路径名,如下例所示:

DHC-APP>WRITE ##class(%Library.File).NormalizeDirectory("CACHE.DAT"),!
E:\DtHealth\db\dthis\data\CACHE.DAT\
 
DHC-APP>ZNSPACE "USER"
 
USER>WRITE ##class(%Library.File).NormalizeDirectory("CACHE.DAT")
C:\InterSystems\Cache\mgr\user\CACHE.DAT\

但是,NormalizeDirectory()不能使用通配符。

通配符

$ZSEARCH允许在带引号的目标字符串中使用以下通配符表达式。

通配符 匹配
* 匹配包含零个或多个字符的任何字符串。
? 匹配单个字符。在Windows系统上,匹配名称元素末尾的一个或零个字符。

这些通配符遵循主机平台的使用规则。在Windows上,$ZSEARCH执行与大小写无关的搜索,然后返回找到的文件或目录的实际大小写。例如,“j*”可以与“Journal”、“Journal”或“Journal”匹配;实际的目录名是“Journal”,这是返回的名称。

在Windows和UNIX®系统上,还可以使用以下标准路径名符号:单点(.)。指定当前目录或双点(..)。若要指定其父目录,请执行以下操作。这些符号可以与通配符组合使用。

参数

target

以下是目标参数的可用值类型:

Target 类型 描述
pathname 计算结果为指定要列出的文件或文件组的路径的字符串的表达式。
filename 一个文件名。默认位置是当前数据集。
null string ("") 返回前一个$ZSEARCH中的下一个匹配文件名。
示例

下面的Windows示例在Samples命名空间中查找以“.dat”作为文件扩展名的所有文件。

/// d ##class(PHA.TEST.Function).ZSEARCH()
ClassMethod ZSEARCH()
{
	NEW $NAMESPACE
	SET $NAMESPACE="Samples"
	SET file=$ZSEARCH("*.DAT")
	WHILE file'="" {
		WRITE !,file
		SET file=$ZSEARCH("")
	}
	WRITE !,"这就是所有匹配的文件"
	QUIT
}
DHC-APP>d ##class(PHA.TEST.Function).ZSEARCH()
 
C:\InterSystems\Cache\mgr\samples\CACHE.DAT
这就是所有匹配的文件

下面的Windows示例在Samples命名空间中查找以字母“c”开头的所有文件。

/// d ##class(PHA.TEST.Function).ZSEARCH1()
ClassMethod ZSEARCH1()
{
	NEW $NAMESPACE
	SET $NAMESPACE="dhc-app"
	SET file=$ZSEARCH("c*")
	WHILE file'="" {
		WRITE !,file
		SET file=$ZSEARCH("")
	}
	WRITE !,"这就是所有匹配的文件"
	QUIT
}
DHC-APP>d ##class(PHA.TEST.Function).ZSEARCH1()
 
E:\DtHealth\db\dthis\data\CACHE.DAT
E:\DtHealth\db\dthis\data\cache.lck
这就是所有匹配的文件
注意

目录锁定

为了提供准确的结果,该过程会使目录保持打开状态,直到$ZSEARCH返回目录中的所有文件(即,直到$ZSEARCH返回空字符串或启动新的$ZSEARCH)。这可能会阻止其他操作,例如删除目录。启动$ZSEARCH时,应该始终重复$ZSEARCH(“”),直到它返回空字符串。如果不想检索所有文件,也可以使用已知不存在的文件名发出$ZSEARCH,例如$ZSEARCH(-1)。

Windows支持

对于Windows,目标参数是标准文件规范,可能包含通配符(*和?)。

  • 通配符*可用于匹配点,但?通配符不能。因此,“MYFILE*”与MYFILEFOLDER、MYFILE.DOC和MYFILEBACKUP.DOC匹配;“MYFILE?DOC”与MYFILE.DOC不匹配。
  • ?通配符与名称元素中的零个字符不匹配。因此,“My?FILE.DOC”与MY2FILE.DOC匹配,但与MYFILE.DOC不匹配。
  • ?通配符匹配名称元素末尾的零个字符。额外的拖尾?通配符将被忽略。因此,“MYFILE?.doc”同时匹配MYFILE2.DOC和MYFILE.DOC。

如果未指定目录,则使用当前工作目录。$ZSEARCH按字母顺序返回目录中的第一个匹配条目。它返回完整的文件规范或完全限定的路径名。无论如何指定,驱动器号始终以大写字母形式返回。

默认情况下,窗口只检查文件扩展名后缀的前三个字符。因此,$ZSEARCH("*。doc)不仅会返回所有带有。文件后缀,但也包括所有带有。docx后缀。如果你想限制你的搜索范围。对于docx文件,必须指定四个字符的后缀:$ ZSEARCH(*)。

UNIX®支持

对于UNIX,目标参数是标准UNIX文件规范,可能包含通配符(*和?).如果不指定目录,则使用当前工作目录。

对于UNIX®,$ZSEARCH返回目录中的第一个活动条目。由于UNIX®不按字母顺序保存目录条目,因此返回值不是按字母顺序排列的。与Windows平台不同,$ZSEARCH函数不返回完整的文件规范或完全限定的路径名,除非使用当前工作目录。