第一章 查询目录和驱动器
%Library.File
(简称%File
)为处理文件和目录提供了广泛的API。本文将介绍该API的主要功能。有关属性、方法和查询的规范列表,请参见类参考。
注意:如果指定了部分文件名或目录名,这些方法中的大多数都引用的项相对于包含正在使用的命名空间的默认全局数据库的目录。该目录在本文中称为“默认目录”。这条规则的任何例外都在文章中注明。
此外,仅当基础操作系统将文件名和目录名视为区分大小写时,这些方法才会将文件名或目录名视为区分大小写。也就是说,文件或目录名在Unix上区分大小写,但在Windows上不区分大小写。
查询目录和驱动器
列出目录的内容
FileSet
类查询列出目录的内容。此查询按顺序接受以下参数:
1. directory
— 指定要检查的目录的名称。
2. wildcards
通配符 — 指定要匹配的文件名模式(如果有)。
3. sortby
排序依据 — 指定如何对结果进行排序。使用以下值之一:
- Name
名称—文件的名称(默认)
- Type
类型—项目类型
- DateCreated
创建日期—创建文件的日期和时间
- DateModified
日期修改—文件上次修改的日期和时间
- Size
大小—文件大小
4. includedirs
—指定如何处理给定目录中的目录。如果此参数为真(1),查询将返回任何文件之前的所有目录,并且目录名忽略通配符参数。如果此参数为false (0),通配符参数适用于文件和目录。默认值为0。
5. delimiter
分隔符—指定通配符参数中通配符之间的分隔符。默认值为;
此查询返回的结果集提供了以下字段:
Name
名称—项目的完整路径名。Type
类型—项目的类型:F
表示文件,D
表示目录,S
表示符号链接。Size
大小—文件大小,以字节为单位。对于目录和符号链接,此字段为空。DateCreated
创建日期—创建项目时的日期和时间,格式为yyyy-mm-dd hh:mm:ss
。DateModified
日期修改—上次修改项目的日期和时间,格式为yyyy-mm-dd hh:mm:ss
。ItemName
项目名称—项目的简称。对于文件,这是单独的文件名,没有目录。对于目录,这只是目录路径的最后一部分。
注意:Windows是目前唯一跟踪实际创建日期的平台。其他平台存储最后一次文件状态更改的日期。
下面是一个使用这个类查询的简单示例:
/// desc:查看目标路径所有文件。
/// w ##class(Demo.FileDemo).ShowDir("C:\InterSystems\Cache\mgr", "*.log", "Size")
/// w ##class(Demo.FileDemo).ShowDir("E:\temp", "*.xml", "Size")
ClassMethod ShowDir(dir As %String = "", wildcard As %String = "", sort As %String = "Name")
{
s stmt = ##class(%SQL.Statement).%New()
s status = stmt.%PrepareClassQuery("%File", "FileSet")
if $$$ISERR(status) {
do $system.OBJ.DisplayError(status)
quit
}
s resultSet = stmt.%Execute(dir, wildcard, sort)
while resultSet.%Next() {
w !, resultSet.%Get("Name")
w " ", resultSet.%Get("Type")
w " ", resultSet.%Get("Size")
}
q ""
}
从终端对指定目录运行此方法,筛选日志文件,并按文件大小排序,结果如下所示:
DHC-APP> w ##class(Demo.FileDemo).ShowDir("E:\temp", "*.xml", "Size")
E:\temp\testPerson.xml F 117
E:\temp\samplePerson.xml F 327
E:\temp\xmlnewtest.xml F 351
E:\temp\Person.xml F 259854
E:\temp\tempPerson.xml F 259854
又例如,下面的方法递归检查目录及其所有子目录,并写出它找到的每个文件的名称:
/// w ##class(Demo.FileDemo).ShowFilesInDir("E:\temp")
ClassMethod ShowFilesInDir(directory As %String = "")
{
s stmt = ##class(%SQL.Statement).%New()
s status = stmt.%PrepareClassQuery("%File", "FileSet")
if $$$ISERR(status) {
d $system.OBJ.DisplayError(status)
q
}
s resultSet = stmt.%Execute(directory)
while resultSet.%Next() {
s name = resultSet.%Get("Name")
s type = resultSet.%Get("Type")
if (type = "F") {
w !, name
} elseif (type = "D"){
d ..ShowFilesInDir(name)
}
}
q ""
}
在默认目录下的终端中运行此方法会产生如下结果:
DHC-APP>w ##class(Demo.FileDemo).ShowFilesInDir("E:\temp")
E:\temp\config.txt
E:\temp\game.jpg
E:\temp\Person.xml
E:\temp\ppg.txt
E:\temp\qcache.txt
E:\temp\rfc7158.html
E:\temp\rfc7158.txt
E:\temp\samplePerson.xml
E:\temp\SecurityXml.txt
E:\temp\temp1.txt
E:\temp\tempPerson.xml
E:\temp\test\Tests.xml
E:\temp\testPerson.xml
E:\temp\Testzf.dll
E:\temp\textReader.txt
E:\temp\xmlnewtest.xml
E:\temp\xmlXpath.txt
E:\temp\yaoxin.txt
E:\temp\yxtest.txt
E:\temp\yxtest_Errors.log
E:\temp\yxtest_Unsupported.log
E:\temp\汉子转拼音global.gof
列出驱动器或装载的文件系统
Drivelist
类查询列出可用的驱动器(在Windows上)或已装载的文件系统(在Unix上)。此查询接受一个参数:
fullyqualified
-如果此参数为1,则查询在每个Windows驱动器名称上都包含一个尾随反斜杠。对其他平台没有影响。默认值为0。
此查询返回的结果集提供了一个字段:
Drive
驱动器—驱动器的名称(在Windows上)或装载的文件系统的名称(在Unix上)。
以下示例显示了如何使用该查询:
/// w ##class(Demo.FileDemo).ShowDrives()
ClassMethod ShowDrives()
{
s stmt = ##class(%SQL.Statement).%New()
s status = stmt.%PrepareClassQuery("%File","DriveList")
if $$$ISERR(status) {
d $system.OBJ.DisplayError(status)
q
}
s resultSet = stmt.%Execute(1)
while resultSet.%Next() {
w !, resultSet.%Get("Drive")
}
q ""
}
在终端中运行该方法会得到如下结果:
DHC-APP>w ##class(Demo.FileDemo).ShowDrives()
c:\
d:\
e:\
g:\