在自定义脚本中,除了 os 模块对应的系统操作之外,还有文件 io 操作也是我们经常需要使用的,比如读写文件数据等等。而 xmake 内部提供的 io 模块是在 lua 原生模块的基础上做了一些改进,比如新增了序列化读写接口,文件锁接口等等,另外还对 unicode 编码也进行了很好的支持。
接下来,我们会逐一介绍下 io 模块中一些比较常用的接口是如何使用的。
读写数据到文件
我们先来简单介绍下 io 模块中最简单方便地读写文件数据的接口操作,不过在此之前,我们还是先来创建一个用于当前实验操作的空工程。
cd Code
xmake create iotest
工程创建完成后,进入 iotest 文件夹,然后编辑 xmake.lua 文件,在编译前通过 io 模块读写 src/main.cpp
源文件,并做一些文本替换处理,然后重新写回后再进行编译。
target("iotest")
set_kind("binary")
add_files("src/*.cpp")
before_build_file(function (target, sourcefile)
local data = io.readfile(sourcefile)
if data then
print("readfile", data)
data = data:gsub("world", "xmake")
io.writefile(sourcefile, data)
print("writefile", data)
end
end)
这里我们用到了 io.readfile
和 io.writefile
两个接口来快速的读写指定的文件,这两个接口并不是 lua 原生提供的接口,而是 xmake 为了方便 io 操作,额外封装的接口,可以让大家不必自己去 open 和 close 文件,就能快速读写文件数据,非常的实用。
通过执行 xmake
编译,我们会看到下图的数据内容,另外 main.cpp
中的 world
字符串也确实被替换成了 xmake
字符串。
运行 xmake run
继续确认下输出结果是否真的被改写为 hello xmake!
,如下图。
当然除了快速读写,还可以使用原生的 io.open
接口来读写文件,虽然这样使用起来稍微繁琐些,但也是有一些不可替代的优势,比如对大文件的读写性能会非常的好,毕竟 io.readfile
需要一次性加载到内存,而通过 open 后返回的文件对象去读写可以按行读以及分批写入,极大地减少内存使用。
另外,这样的读写方式也更加的灵活,我们修改 xmake.lua 文件,将里面的读写方式改成使