SPL:文件目录操作
SPL 提供了丰富的针对文件系统的函数,能方便地处理目录以及文件。
1 目录
SPL 用 directory 函数列出文件目录或者文件,并以序列形式返回。用于示例,本机目录 d:/test 下的第一层文件结构如图:
以及整个 test 目录下的子目录结构如图:
1.1. 列出文件名
directory 函数有诸多选项,用于列出不同条件下的结果。缺省选项时,也即没有任何选项,仅列出指定目录下的所有文件 (不包含子目录),如下表达式:
=directory(“d:/test”)
返回的结果只包含当前目录下的文件,结果如图:
1.2. 列出子目录
使用选项 @d 时,则只列出指定目录下的第一级子目录,譬如表达式:
=directory@d(“d:/test”)
返回的结果只包含第一级子目录(不包含文件),如下图:
1.3. 列出所有文件或子目录
1.1 和 1.2 节中,仅列出了指定目录的第一级子目录或文件。那如果需要列出所有嵌套子目录或文件,则需要加上选项 @s,如下表达式:
=directory@s(“d:/test”)
返回结果为所有子目录中的文件,由于文件有点多,截取结果的前 10 个内容如图:
上面表达式列出了指定目录下的所有文件。如果只列出想要的部分类型文件,则可以在表达式中使用通配符,比如 *,?等。比如仅列出扩展名为 png 的图片文件,则可以使用如下表达式:
=directory@s(“d:/test/*.png”)
返回的结果为只包含 png 格式的图片文件名,部分结果如图:
列出所有子目录的方法类似,使用 @d 选项表示列出目录,再用 @s 选项表示递归搜索全部子目录,表达式如下:
=directory@ds(“d:/test”)
返回所有子目录,结果如图:
1.4. 列出绝对路径
当使用 @s 选项列出全部子目录或者文件时,1.3 节中返回的都是只含名称的文件名。而只有文件名时,没法直接操作该文件,这时需要得到文件的绝对路径。
使用 @p 选项返回带绝对路径的文件名,如下表达式:
=directory@sp(“d:/test”)
返回带绝对路径的文件名,部分结果如图:
1.5. 创建目录
使用 @m 选项,可以创建目录,如下表达式:
=directory@m(“d:/test/sub1/sub2”)
创建目录时,可以多级连续创建,比如上例中 sub1 也可以不存在,函数会将所有没创建的父目录一并创建出来。
1.6. 删除目录
使用 @r 选项,可以删除指定的目录:
=directory@r(“d:/test/sub1/sub2”)
上述代码会将 sub2 目录删除。
不过要注意的是,待删除的目录必须为空,才会被删除。如果非空,则上述代码返回值为 false,而不会删除指定的目录。
如果要强行删除非空的目录,则可以使用另一个函数:
=movefile@y(“d:/test/sub1/sub2”)
该函数使用 @y 选项强制删除指定的非空目录。
2 文件
使用 SPL 的 filename 函数可以将文件名的各部分分离出来。还可以使用 movefile 函数将文件移动,复制,或者删除等操作。
下面是一些文件名相关的操作示例。
2.1. 拆分文件名
使用 filename 函数可以将包含路径的文件名,分离出文件名:
=filename(“d:/test/MyApp/icon.png”)
执行上述代码后,便可获得文件名,结果如图:
拆分还有更多选项,比如:
使用 @e 选项,则只返回扩展名 png。
使用 @n 选项则返回不带扩展名的文件名 icon。
使用 @d 选项则只返回路径 d:/test/MyApp。
2.2. 移动和复制文件
使用 movefile 函数将文件移动到目的路径下。下例将文件 d:/test/MyApp/icon.png 移动到 d:/node 下面:
=movefile("d:/test/MyApp/icon.png","d:/node")
如果想将文件复制到目的路径下,则需要使用选项 @c,比如:
=movefile@c("d:/test/MyApp/icon.png","d:/node")
2.3. 删除文件
删除文件时仍然使用 movefile 函数,此时不填写目的路径,即:
=movefile("d:/test/MyApp/icon.png")
上述表达式会删除指定的文件。
注意,2.2 节中如果目标路径已存在同名文件,或者本节中待删除文件只读时,操作会失败。此时需要配合使用选项 @y 强制执行。
2.4. 重命名文件
重命名文件仍然使用 movefile 函数,此时目标不再是一个路径,而是要命名的新文件名。比如下面的示例:
=movefile("d:/test/MyApp/icon.png",”newname.png”)
上述代码将文件 d:/test/MyApp/icon.png 重新命名为 newname.png。
3 文件对象
使用 file 函数打开指定文件,并返回文件对象。
3.1. 打开文件
使用 file 函数打开指定的文件,如下表达式:
=file("d:/test/MyApp/config/ideconfig.json”)
返回这个 json 文件的文件对象。
注意:打开文件时默认使用操作系统的缺省字符集读取文件。如果要指定字符集,则需要用冒号隔开,比如用 UTF-8 字符集来打开上述文件:
=file("d:/test/MyApp/config/ideconfig.json”:”UTF-8”)
3.2. 创建临时文件
使用 file 函数的 @t 选项,便可以在指定的目录下创建一个名字随机的临时文件,比如:
=file@t("d:/tmp”)
执行后得到一个随机名字的临时文件,结果如图:
该临时文件所在的目录可以事先不存在,创建临时文件时,会自动创建好相应结构的目录。
注意:临时文件需要自己维护,文件使用完成后,需要主动删除。删除方法为使用 2.3 节的 movefile 函数。可以直接将文件对象传给 movefile,删除表达式如下:
=movefile(f)
其中的 f 则为打开的临时文件对象。
不过如果使用临时文件创建游标,且创建时使用了 @x 选项,即 f.cursor@x()语法,则该游标在取数完成后,会自动删除该文件。
3.3. 判断文件存在
通过 3.1 或者 3.2 节获得了文件对象 f 后,便可使用文件对象的 exists 函数返回文件的存在状态,表达式如下:
=f.exists()
其中 f 为文件对象,函数返回布尔值,表明文件是否存在。
3.4. 返回文件大小
使用文件对象的 size 函数便可得到当前文件的大小:
=f.size()
其中 f 为文件对象,函数返回整数值,表明文件占用的字节数。
3.5. 返回文件修改日期
使用文件对象的 date 函数便可得到当前文件的最后修改日期:
=f.date()
其中 f 为文件对象,函数返回日期时间值,表明文件的最后修改时间。
4 应用
4.1. 主目录
SPL 应用环境中可以设置一个主目录,将子目录或者文件放在主目录下时,在 SPL 中引用该文件则只需指定相对于主目录的相对路径即可。譬如将当前示例环境的主目录设置为 d:/test/MyApp 时,再使用 file 函数打开 d:/test/MyApp/icon.png,只需写文件名,表达式为:
=file(“icon.png”)
有了主目录,各主机可以根据各自环境将主目录设置在不同的磁盘或者目录下。SPL 脚本由于引用的是相对路径,所以可以很方便地移植到不同主机。
开发设计器中可以打开选项菜单,设置如下红框属性为应用主目录:
设置了主目录后,再来执行一遍 1.4 节中的如下代码:
=directory@sp(“d:/test”)
发现返回结果有了变化,部分结果截图如下:
可以看到从第 4 个元素开始,后面的文件因为都位于主目录下,所以即使使用了 @p 选项返回绝对路径,返回的仍然是相对于主目录的相对路径。
这样做的好处是,你只管使用 @p 选项获取绝对路径,然后在脚本中打开“绝对路径”的文件操作即可,而不用关心当前操作在不同环境,不同主目录下时是否要特殊处理,都能正确执行。
使用 filename 函数,可以拆分文件名。但如果文件名只是一个相对路径时,则可以指定 @p 选项,用于得到拼上主目录后的绝对路径,如下表达式:
=filename@p(“icon.png”)
返回拼上了主目录的绝对路径,结果如图:
当不指定路径,比如执行:
=filename@p()
则直接返回当前环境的主目录,本例结果为 d:/test/MyApp。
4.2. 寻址路径
当项目比较大时,往往会有比较多的文件。而这些项目文件,尤其是开发的 SPL 脚本文件,通常需要分类管理。如果将所有文件都放到主目录下,会造成主目录下文件过多,太过臃肿。
SPL 应用环境中,为此设置了寻址路径。寻址路径可以用分号分隔,从而可以设置多个值,以便更好地对项目脚本文件分门别类。
应用的寻址路径设置类似于主目录,如下图中红框属性:
引用主目录或者寻址路径下的文件时,都是使用相对路径。但在用法上还是有一些区别:
1, 主目录只可以设置一个,寻址路径可以为多个。
2, 使用 file 函数打开相对路径的文件时,缺省选项只相对于主目录。如果要相对于寻址路径,则需要指定 @s 选项。即使用 file@s 语法。
3, 使用 directory@p 函数返回绝对路径时,如果文件位于主目录下,则仍然返回相对于主目录的相对路径。
4.3. 临时目录
应用开发中会用到一些临时文件,为了集中管理临时文件,SPL 应用环境也设置了临时目录。临时目录跟寻址路径的设置类似,也是使用分号分隔,可以设置多个目录。如下图中的红框属性设置临时目录:
设置了临时目录后,3.2 节中使用 file@t函数创建临时文件时,就可以不需要指定在哪个目录下创建了。而是空出目录参数,此时系统会将临时文件自动创建在第一个临时目录下。如下的表达式:
=file@t()
执行后便可得到在应用环境指定的临时目录下,创建的临时文件,结果如图:
可以看到此时的临时文件位于红色框住的应用临时目录下面。
注意:应用环境的临时目录可以不设置。如果没有设置临时目录,执行上述不带目录的创建临时文件函数,则会报错。