跳转至

文件系统(io)

一、简介

文件系统为用户代码运行过程中动态生成的文件提供了存储空间,这个空间被称为文件系统分区。

模块具有 64Mb 的 flash 空间,除了模块自身程序占用以外还剩余了一部分空间可供用户使用,用户可以在这个空间内创建、读取、写入和删除文件,以支持模组在各种应用场景中的需求。

二、演示功能概述

本教程教你如何用 Air724 开发板,进行文件系统功能演示,如创建、读取、写入和删除文件。

三、准备硬件环境

3.1 开发板准备

使用 EVB_Air724 开发板,如下图所示:

淘宝购买链接:Air724UG-NFM 开发板淘宝购买链接

此开发板的详细使用说明参考:Air724UG 产品手册 中的《EVB_Air724UG_AXX 开发板使用说明》,写这篇文章时最新版本的使用说明为:《EVB_Air724UG_A14 开发板使用说明》;开发板使用过程中遇到任何问题,可以直接参考这份使用说明文档。

api:https://doc.openluat.com/wiki/21?wiki_page_id=2068

3.2 数据通信线

USB 数据线一根(micro USB)。

3.3 PC 电脑

WIN7 以及以上版本的 WINDOWS 系统。

3.4 SIM 卡

中国大陆环境下,可以上网的 SIM 卡。一般来说,使用移动,电信,联通的物联网卡或者手机卡都行。

3.5 组装硬件环境

USB 数据线插入 USB 口,另一端与电脑相连,拨码开关全部拨到 ON,串口切换开关选择 UART1,USB 供电的 4V 对应开关拨至 ON 档,SIM 卡放到 SIM 卡槽中锁紧,如下图所示。

四、准备软件环境

4.1 下载调试工具

使用说明参考:Luatools 下载和详细使用

4.2 源码及固件

1.底层 core 下载

下载底层固件,并解压

链接:https://docs.openluat.com/air724ug/luatos/firmware/

如下图所示,红框的是我们要使用到的。

2.本教程使用的 demo:

https://gitee.com/openLuat/LuatOS-Air724UG/tree/master/script_LuaTask/demo/fs

4.3 下载固件和脚本到开发板中

打开 Luatools,开发板上电开机,如开机成功 Luatools 会打印如下信息。

点击项目管理测试选项。

进入管理界面,如下图所示。

  • 点击选择文件,选择底层固件,我的文件放在 D:\luatOS\Air724 路径中。

  • 点击增加脚本或资源文件,选择 之前下载的程序源码,如下图所示。

  • 点击下载底层和脚本,下载完成如下图所示。

五、代码示例介绍

5.1 API 说明

LuatOS 的文件操作来自标准 lua 的 io 库直接按照标准语法使用即可,

除了标准语法,LuatOS 提供了几个更方便的文件操作接口可以使用。

API 接口
描述
io.exists(path)
判断文件是否存在
io.readFile(path)
读取文件并返回文件的内容
io.writeFile(path, content, mode)
写入文件指定的内容,默认为覆盖二进制模式
io.pathInfo(path)
将文件路径分解为 table 信息
io.fileSize(path)
返回文件大小
io.readStream(path, offset, len)
返回指定位置读取的字符串
rtos.make_dir(path)
创建目录
rtos.remove_dir(path)
删除目录
os.remove()
删除文件
os.rename (oldname, newname)
文件重命名

详细的 API 介绍见 io API 章节

5.2 testFs.lua 代码

系统启动后,每隔 5 秒打印文件系统的剩余空间。

--- 模块功能:文件操作功能测试.
-- @author openLuat
-- @module fs.testFs
-- @license MIT
-- @copyright openLuat
-- @release 2018.03.27

module(...,package.seeall)

local USER_DIR_PATH = "/user_dir"

--[[该demo提供四种接口,第一种readfile(filename)读文件,第二种writevala(filename,value),写文件内容,附加模式,
第三种function writevalw(filename,value),写文件内容,覆盖模式,第四种deletefile(filename),删除文件。--]]

--[[
    函数名:readfile(filename)
    功能:打开所输入文件名的文件,并输出储存在里面额内容
    参数:文件名
    返回值:无                     ]]
local function readfile(filename)--打开指定文件并输出内容

    local filehandle=io.open(filename,"r")--第一个参数是文件名,第二个是打开方式,'r'读模式,'w'写模式,对数据进行覆盖,'a'附加模式,'b'加在模式后面表示以二进制形式打开
    if filehandle then          --判断文件是否存在
        local fileval=filehandle:read("*all")--读出文件内容
      if  fileval  then
           print(fileval)  --如果文件存在,打印文件内容
           filehandle:close()--关闭文件
      else
           print("文件为空")--文件不存在
      end
    else
        print("文件不存在或文件输入格式不正确") --打开失败
    end

end

--[[
    函数名: writevala(filename,value)
    功能:向输入的文件中添加内容,内容附加在原文件内容之后
    参数:第一个文件名,第二个需要添加的内容
    返回值:无                         --]]
local function writevala(filename,value)--在指定文件中添加内容,函数名最后一位就是打开的模式
    local filehandle = io.open(filename,"a+")--第一个参数是文件名,后一个是打开模式'r'读模式,'w'写模式,对数据进行覆盖,'a'附加模式,'b'加在模式后面表示以二进制形式打开
    if filehandle then
        filehandle:write(value)--写入要写入的内容
        filehandle:close()
    else
        print("文件不存在或文件输入格式不正确") --打开失败
    end
end

--[[
    函数名:writevalw(filename,value)
    功能:向输入文件中添加内容,新添加的内容会覆盖掉原文件中的内容
    参数:同上
    返回值:无                 --]]
local function writevalw(filename,value)--在指定文件中添加内容
    local filehandle = io.open(filename,"w")--第一个参数是文件名,后一个是打开模式'r'读模式,'w'写模式,对数据进行覆盖,'a'附加模式,'b'加在模式后面表示以二进制形式打开
    if filehandle then
        filehandle:write(value)--写入要写入的内容
        filehandle:close()
    else
        print("文件不存在或文件输入格式不正确") --打开失败
    end
end

--[[函数名:deletefile(filename)
    功能:删除指定文件
    参数:文件名
    返回值:无             --]]
local function deletefile(filename)
    os.remove(filename)
end

--打印文件系统的剩余空间
print("get_fs_free_size: "..rtos.get_fs_free_size().." Bytes")
sys.timerLoopStart(function() print("get_fs_free_size: "..rtos.get_fs_free_size().." Bytes") end,5000)
--成功创建一个目录(目录已存在,也返回true表示创建成功)
if rtos.make_dir(USER_DIR_PATH) then
    log.info("testFs.readfile")
    readfile(USER_DIR_PATH.."/3.txt")

    log.info("testFs.writevala")
    writevala(USER_DIR_PATH.."/3.txt","great")

    log.info("testFs.readfile")
    readfile(USER_DIR_PATH.."/3.txt")
    log.info("testFs.writevalw")
    writevalw(USER_DIR_PATH.."/3.txt","great")
    log.info("testFs.readfile")
    readfile(USER_DIR_PATH.."/3.txt")

    log.info("testFs.deletefile")
    deletefile(USER_DIR_PATH.."/3.txt")
    log.info("testFs.readfile")
    readfile(USER_DIR_PATH.."/3.txt")
end

5.3 main.lua 代码

本代码为主程序脚本,系统启动后首先会对 4G 网络进行配置,等待网络连接成功,然后加载测试模块。

5.4 testFs1basic.lua 代码

这个脚本用于测试文件系统的基础功能,例如文件的创建、删除、读取、写入等。并且打印输出日志。

--- 模块功能:文件操作功能测试.
-- @author openLuat
-- @module fs.testFs
-- @license MIT
-- @copyright openLuat
-- @release 2018.03.27

module(...,package.seeall)

local USER_DIR1,USER_DIR11 = "/dir1","/dir11"
local USER_DIR2,USER_DIR21,USER_DIR211 = "/dir2","/dir21","/dir211"
local USER_DIR3 = "/dir3"

--[[该demo提供四种接口,第一种readfile(filename)读文件,第二种writevala(filename,value),写文件内容,附加模式,
第三种function writevalw(filename,value),写文件内容,覆盖模式,第四种deletefile(filename),删除文件。--]]

--[[
    函数名:readfile(filename)
    功能:打开所输入文件名的文件,并输出储存在里面额内容
    参数:文件名
    返回值:无                     ]]
local function readfile(filename)--打开指定文件并输出内容

    local filehandle=io.open(filename,"r")--第一个参数是文件名,第二个是打开方式,'r'读模式,'w'写模式,对数据进行覆盖,'a'附加模式,'b'加在模式后面表示以二进制形式打开
    if filehandle then          --判断文件是否存在
        local fileval=filehandle:read("*all")--读出文件内容
      if  fileval  then
           print(fileval)  --如果文件存在,打印文件内容
           filehandle:close()--关闭文件
      else
           print("The file is empty")--文件不存在
      end
    else
        print("文件不存在或文件输入格式不正确") --打开失败
    end

end

--[[
    函数名: writevala(filename,value)
    功能:向输入的文件中添加内容,内容附加在原文件内容之后
    参数:第一个文件名,第二个需要添加的内容
    返回值:无                         --]]
local function writevala(filename,value)--在指定文件中添加内容,函数名最后一位就是打开的模式
    local filehandle = io.open(filename,"a+")--第一个参数是文件名,后一个是打开模式'r'读模式,'w'写模式,对数据进行覆盖,'a'附加模式,'b'加在模式后面表示以二进制形式打开
    if filehandle then
        filehandle:write(value)--写入要写入的内容
        filehandle:close()
    else
        print("文件不存在或文件输入格式不正确") --打开失败
    end
end

--[[
    函数名:writevalw(filename,value)
    功能:向输入文件中添加内容,新添加的内容会覆盖掉原文件中的内容
    参数:同上
    返回值:无                 --]]
local function writevalw(filename,value)--在指定文件中添加内容
    local filehandle = io.open(filename,"w")--第一个参数是文件名,后一个是打开模式'r'读模式,'w'写模式,对数据进行覆盖,'a'附加模式,'b'加在模式后面表示以二进制形式打开
    if filehandle then
        filehandle:write(value)--写入要写入的内容
        filehandle:close()
    else
        print("文件不存在或文件输入格式不正确") --打开失败
    end
end

--[[函数名:deletefile(filename)
    功能:删除指定文件中的所有内容
    参数:文件名
    返回值:无             --]]
local function deletefile(filename)--删除指定文件夹中的所有内容
    local filehandle = io.open(filename,"w")
    if filehandle then
        filehandle:write()--写入空的内容
        print("successfully delete")
        filehandle:close()
    else
        print("文件不存在或文件输入格式不正确") --打开失败
    end
end

--打印文件系统的剩余空间
print("get_fs_free_size: "..rtos.get_fs_free_size().." Bytes")
--成功创建一个目录(目录已存在,也返回true表示创建成功)

local function dir1test()
    if rtos.make_dir(USER_DIR1) then
        if rtos.make_dir(USER_DIR11) then
            --readfile(USER_DIR11.."/file11.txt")
            writevala(USER_DIR11.."/file11.txt","file11 test")
            readfile(USER_DIR11.."/file11.txt")
            writevalw(USER_DIR11.."/file11.txt","file11 test2")
            --deletefile(USER_DIR11.."/file11.txt")
            local rt = os.remove(USER_DIR11.."/file11.txt")
            print("dir1test file11 os.remove rt",rt)
            readfile(USER_DIR11.."/file11.txt")

            --readfile(USER_DIR11.."/file12.txt")
            writevala(USER_DIR11.."/file12.txt","file11 test")
            readfile(USER_DIR11.."/file12.txt")
            writevalw(USER_DIR11.."/file12.txt","file11 test2")
            --deletefile(USER_DIR11.."/file12.txt")
            local rt = os.remove(USER_DIR11.."/file12.txt")
            print("dir1test file12 os.remove rt",rt)
            readfile(USER_DIR11.."/file12.txt")
        end
    end
end

local function dir2test()
    if rtos.make_dir(USER_DIR2) then
        if rtos.make_dir(USER_DIR21) then
            rtos.make_dir(USER_DIR211)
            --readfile(USER_DIR21.."/file21.txt")
            writevala(USER_DIR21.."/file21.txt","file21 test")
            readfile(USER_DIR21.."/file21.txt")
            writevalw(USER_DIR21.."/file21.txt","file21 test2")
            --deletefile(USER_DIR21.."/file21.txt")
            local rt = os.remove(USER_DIR21.."/file21.txt")
            print("dir2test file21 os.remove rt",rt)
            readfile(USER_DIR21.."/file21.txt")

            --readfile(USER_DIR21.."/file3.txt")
            writevala(USER_DIR21.."/file3.txt","file3 test")
            readfile(USER_DIR21.."/file3.txt")
            writevalw(USER_DIR21.."/file3.txt","file3 test2")
            --deletefile(USER_DIR21.."/file3.txt")
            local rt = os.remove(USER_DIR21.."/file3.txt")
            print("dir2test file3 os.remove rt",rt)
            readfile(USER_DIR21.."/file3.txt")
        end
    end
end

local function file1test()
    --readfile("/file1.txt")
    writevala("/file1.txt","file1 test")
    readfile("/file1.txt")
    writevalw("/file1.txt","file1 test2")
    --deletefile("/file1.txt")
    local rt = os.remove("/file1.txt")
    print("file1test os.remove rt",rt)
    readfile("/file1.txt")
end

local function file3test()
    --readfile("/file3.txt")
    writevala("/file3.txt","file3 test")
    readfile("/file3.txt")
    writevalw("/file3.txt","file3 test2")
    --deletefile("/file3.txt")
    local rt = os.remove("/file3.txt")
    print("file3test os.remove rt",rt)
    readfile("/file3.txt")
end

local function file4test()
    --readfile("/file4.txt")
    writevala("/file4.txt","file4 test")
    readfile("/file4.txt")
    writevalw("/file4.txt","file4 test2")
    --deletefile("/file4.txt")
    local rt = os.remove("/file4.txt")
    print("file4test os.remove rt",rt)
    readfile("/file4.txt")
end

local function dir3test()
    if rtos.make_dir(USER_DIR3) then
        print("MAKE DIR3 SUCC")
    else
        print("MAKE DIR3 FAIL")
    end
end

local function test()
    file1test()
    dir1test()
    dir2test()
    file3test()
    file4test()
    dir3test()
end

sys.timerLoopStart(test,1000)

5.5 testFs2sysperform.lua 代码

这个脚本用来测试文件系统相关的性能。读写速度、文件创建和删除的速度、文件操作的响应时间等进行压力测试。

--- 模块功能:文件操作功能测试.
-- @author openLuat
-- @module fs.testFs
-- @license MIT
-- @copyright openLuat
-- @release 2018.03.27

module(...,package.seeall)

local USER_DIR1,USER_DIR11 = "/dir1","/dir11"
local USER_DIR2,USER_DIR21,USER_DIR211 = "/dir2","/dir21","/dir211"
local USER_DIR3 = "/dir3"
local rt = true

--[[该demo提供四种接口,第一种readfile(filename)读文件,第二种writevala(filename,value),写文件内容,附加模式,
第三种function writevalw(filename,value),写文件内容,覆盖模式,第四种deletefile(filename),删除文件。--]]

--[[
    函数名:readfile(filename)
    功能:打开所输入文件名的文件,并输出储存在里面额内容
    参数:文件名
    返回值:无                     ]]
local function readfile(filename)--打开指定文件并输出内容

    local filehandle=io.open(filename,"r")--第一个参数是文件名,第二个是打开方式,'r'读模式,'w'写模式,对数据进行覆盖,'a'附加模式,'b'加在模式后面表示以二进制形式打开
    if filehandle then          --判断文件是否存在
        local fileval=filehandle:read("*all")--读出文件内容
      if  fileval  then
           print(filename)  --如果文件存在,打印文件内容
           filehandle:close()--关闭文件
      else
           print("The file is empty")--文件不存在
      end
    else
        print("文件不存在或文件输入格式不正确") --打开失败
    end

end

--[[
    函数名: writevala(filename,value)
    功能:向输入的文件中添加内容,内容附加在原文件内容之后
    参数:第一个文件名,第二个需要添加的内容
    返回值:无                         --]]
local function writevala(filename,value)--在指定文件中添加内容,函数名最后一位就是打开的模式
    local filehandle = io.open(filename,"a+")--第一个参数是文件名,后一个是打开模式'r'读模式,'w'写模式,对数据进行覆盖,'a'附加模式,'b'加在模式后面表示以二进制形式打开
    if filehandle then
        rt = filehandle:write(value)--写入要写入的内容
        print("writevala rt",rt)
        filehandle:close()
    else
        print("文件不存在或文件输入格式不正确") --打开失败
    end
end

--[[
    函数名:writevalw(filename,value)
    功能:向输入文件中添加内容,新添加的内容会覆盖掉原文件中的内容
    参数:同上
    返回值:无                 --]]
local function writevalw(filename,value)--在指定文件中添加内容
    local filehandle = io.open(filename,"w")--第一个参数是文件名,后一个是打开模式'r'读模式,'w'写模式,对数据进行覆盖,'a'附加模式,'b'加在模式后面表示以二进制形式打开
    if filehandle then
        rt = filehandle:write(value)--写入要写入的内容
        print("writevalw rt",rt)
        filehandle:close()
    else
        print("文件不存在或文件输入格式不正确") --打开失败
    end
end

--[[函数名:deletefile(filename)
    功能:删除指定文件中的所有内容
    参数:文件名
    返回值:无             --]]
local function deletefile(filename)--删除指定文件夹中的所有内容
    local filehandle = io.open(filename,"w")
    if filehandle then
        filehandle:write()--写入空的内容
        print("successfully delete")
        filehandle:close()
    else
        print("文件不存在或文件输入格式不正确") --打开失败
    end
end

--打印文件系统的剩余空间
print("get_fs_free_size: "..rtos.get_fs_free_size().." Bytes")
--成功创建一个目录(目录已存在,也返回true表示创建成功)

local function dir1test()
    if rtos.make_dir(USER_DIR1) then
        if rtos.make_dir(USER_DIR11) then
            readfile(USER_DIR11.."/file11.txt")
            writevala(USER_DIR11.."/file11.txt","file11 test")
            readfile(USER_DIR11.."/file11.txt")
            writevalw(USER_DIR11.."/file11.txt","file11 test2")
            deletefile(USER_DIR11.."/file11.txt")
            readfile(USER_DIR11.."/file11.txt")

            readfile(USER_DIR11.."/file12.txt")
            writevala(USER_DIR11.."/file12.txt","file11 test")
            readfile(USER_DIR11.."/file12.txt")
            writevalw(USER_DIR11.."/file12.txt","file11 test2")
            deletefile(USER_DIR11.."/file12.txt")
            readfile(USER_DIR11.."/file12.txt")
        end
    end
end

local function dir2test()
    if rtos.make_dir(USER_DIR2) then
        if rtos.make_dir(USER_DIR21) then
            rtos.make_dir(USER_DIR211)
            readfile(USER_DIR21.."/file21.txt")
            writevala(USER_DIR21.."/file21.txt","file21 test")
            readfile(USER_DIR21.."/file21.txt")
            writevalw(USER_DIR21.."/file21.txt","file21 test2")
            deletefile(USER_DIR21.."/file21.txt")
            readfile(USER_DIR21.."/file21.txt")

            readfile(USER_DIR21.."/file3.txt")
            writevala(USER_DIR21.."/file3.txt","file3 test")
            readfile(USER_DIR21.."/file3.txt")
            writevalw(USER_DIR21.."/file3.txt","file3 test2")
            deletefile(USER_DIR21.."/file3.txt")
            readfile(USER_DIR21.."/file3.txt")
        end
    end
end

local function file1test()
    readfile("/file1.txt")
    writevala("/file1.txt","file1 test")
    readfile("/file1.txt")
    writevalw("/file1.txt","file1 test2")
    deletefile("/file1.txt")
    readfile("/file1.txt")
end

local function file3test()
    readfile("/file3.txt")
    writevala("/file3.txt","file3 test")
    readfile("/file3.txt")
    writevalw("/file3.txt","file3 test2")
    deletefile("/file3.txt")
    readfile("/file3.txt")
end

local function file4test()
    readfile("/file4.txt")
    writevala("/file4.txt","file4 test")
    readfile("/file4.txt")
    writevalw("/file4.txt","file4 test2")
    deletefile("/file4.txt")
    readfile("/file4.txt")
end

local function dir3test()
    if rtos.make_dir(USER_DIR3) then
        print("MAKE DIR3 SUCC")
    else
        print("MAKE DIR3 FAIL")
    end
end

local cnt,tick1,tick2,tick3,size,size1,perc = 0
local str512 = "12345678901234567890123456789012345678901234567890123456789012345678901234567890abcdefghkkll111122222ffssssss33334444455566666777812345678901234567890123456789012345678901234567890123456789012345678901234567890abcdefghkkll111122222ffssssss33334444455566666777812345678901234567890123456789012345678901234567890123456789A012345678901234567890abcdefghkkll111122222ffssssss33334444455566666777812345678901234567890123456789012345678901234567890123456789012345678901234567890abcdefghkkll111122222ffssssss333344444555666667778"
local str = str512..str512..str512..str512
size1 = rtos.get_fs_free_size()
local function test()
    size = rtos.get_fs_free_size()
    --perc = cnt*2*100/962
    perc = size*100/size1
    print("get_fs_free_size: "..size.." Bytes",size1,perc)
    if rt then
        cnt = cnt + 1
    end
    print("cnt: ",cnt)
    tick1 = rtos.tick()
    readfile("/file1.txt")
    tick2 = rtos.tick()
    print("readfile perc tick",perc,tick2 - tick1)
    writevala("/file"..cnt..".txt",str)
    tick3 = rtos.tick()
    print("writevala perc tick",perc,tick3 - tick2)
    if perc == 50 then
        tick1 = rtos.tick()
        for i = 1,10 do
            readfile("/file1.txt")
        end
        tick2 = rtos.tick()
        print("50% readfile",tick2 - tick1)
        for i = 1,10 do
            writevalw("/file1.txt",str)
        end
        tick3 = rtos.tick()
        print("50% writevalw",tick3 - tick2)
    end
end

sys.timerLoopStart(test,1000)

5.6 testFs4useratio.lua 代码

这个脚本用于反复创建多文件,并且打印系统的剩余空间。

--- 模块功能:文件操作功能测试.
-- @author openLuat
-- @module fs.testFs
-- @license MIT
-- @copyright openLuat
-- @release 2018.03.27

module(...,package.seeall)

local USER_DIR1,USER_DIR11 = "/dir1","/dir11"
local USER_DIR2,USER_DIR21,USER_DIR211 = "/dir2","/dir21","/dir211"
local USER_DIR3 = "/dir3"

--[[该demo提供四种接口,第一种readfile(filename)读文件,第二种writevala(filename,value),写文件内容,附加模式,
第三种function writevalw(filename,value),写文件内容,覆盖模式,第四种deletefile(filename),删除文件。--]]

--[[
    函数名:readfile(filename)
    功能:打开所输入文件名的文件,并输出储存在里面额内容
    参数:文件名
    返回值:无                     ]]
local function readfile(filename)--打开指定文件并输出内容

    local filehandle=io.open(filename,"r")--第一个参数是文件名,第二个是打开方式,'r'读模式,'w'写模式,对数据进行覆盖,'a'附加模式,'b'加在模式后面表示以二进制形式打开
    if filehandle then          --判断文件是否存在
        local fileval=filehandle:read("*all")--读出文件内容
      if  fileval  then
           print(filename)  --如果文件存在,打印文件内容
           filehandle:close()--关闭文件
      else
           print("The file is empty")--文件不存在
      end
    else
        print("文件不存在或文件输入格式不正确") --打开失败
    end

end

local rt = true

--[[
    函数名: writevala(filename,value)
    功能:向输入的文件中添加内容,内容附加在原文件内容之后
    参数:第一个文件名,第二个需要添加的内容
    返回值:无                         --]]
local function writevala(filename,value)--在指定文件中添加内容,函数名最后一位就是打开的模式
    local filehandle = io.open(filename,"a+")--第一个参数是文件名,后一个是打开模式'r'读模式,'w'写模式,对数据进行覆盖,'a'附加模式,'b'加在模式后面表示以二进制形式打开
    if filehandle then
        rt = filehandle:write(value)--写入要写入的内容
        print("write rt",rt)
        filehandle:close()
    else
        print("文件不存在或文件输入格式不正确") --打开失败
    end
end

--[[
    函数名:writevalw(filename,value)
    功能:向输入文件中添加内容,新添加的内容会覆盖掉原文件中的内容
    参数:同上
    返回值:无                 --]]
local function writevalw(filename,value)--在指定文件中添加内容
    local filehandle = io.open(filename,"w")--第一个参数是文件名,后一个是打开模式'r'读模式,'w'写模式,对数据进行覆盖,'a'附加模式,'b'加在模式后面表示以二进制形式打开
    if filehandle then
        filehandle:write(value)--写入要写入的内容
        filehandle:close()
    else
        print("文件不存在或文件输入格式不正确") --打开失败
    end
end

--[[函数名:deletefile(filename)
    功能:删除指定文件中的所有内容
    参数:文件名
    返回值:无             --]]
local function deletefile(filename)--删除指定文件夹中的所有内容
    local filehandle = io.open(filename,"w")
    if filehandle then
        filehandle:write()--写入空的内容
        print("successfully delete")
        filehandle:close()
    else
        print("文件不存在或文件输入格式不正确") --打开失败
    end
end

--打印文件系统的剩余空间
print("get_fs_free_size: "..rtos.get_fs_free_size().." Bytes")
--成功创建一个目录(目录已存在,也返回true表示创建成功)

local function dir1test()
    if rtos.make_dir(USER_DIR1) then
        if rtos.make_dir(USER_DIR11) then
            readfile(USER_DIR11.."/file11.txt")
            writevala(USER_DIR11.."/file11.txt","file11 test")
            readfile(USER_DIR11.."/file11.txt")
            writevalw(USER_DIR11.."/file11.txt","file11 test2")
            --deletefile(USER_DIR11.."/file11.txt")
            readfile(USER_DIR11.."/file11.txt")

            readfile(USER_DIR11.."/file12.txt")
            writevala(USER_DIR11.."/file12.txt","file11 test")
            readfile(USER_DIR11.."/file12.txt")
            writevalw(USER_DIR11.."/file12.txt","file11 test2")
            --deletefile(USER_DIR11.."/file12.txt")
            readfile(USER_DIR11.."/file12.txt")
        end
    end
end

local function dir2test()
    if rtos.make_dir(USER_DIR2) then
        if rtos.make_dir(USER_DIR21) then
            rtos.make_dir(USER_DIR211)
            readfile(USER_DIR21.."/file21.txt")
            writevala(USER_DIR21.."/file21.txt","file21 test")
            readfile(USER_DIR21.."/file21.txt")
            writevalw(USER_DIR21.."/file21.txt","file21 test2")
            --deletefile(USER_DIR21.."/file21.txt")
            readfile(USER_DIR21.."/file21.txt")

            readfile(USER_DIR21.."/file3.txt")
            writevala(USER_DIR21.."/file3.txt","file3 test")
            readfile(USER_DIR21.."/file3.txt")
            writevalw(USER_DIR21.."/file3.txt","file3 test2")
            --deletefile(USER_DIR21.."/file3.txt")
            readfile(USER_DIR21.."/file3.txt")
        end
    end
end

local function file1test()
    readfile("/file1.txt")
    writevala("/file1.txt","file1 test")
    readfile("/file1.txt")
    writevalw("/file1.txt","file1 test2")
    --deletefile("/file1.txt")
    readfile("/file1.txt")
end

local function file3test()
    readfile("/file3.txt")
    writevala("/file3.txt","file3 test")
    readfile("/file3.txt")
    writevalw("/file3.txt","file3 test2")
    --deletefile("/file3.txt")
    readfile("/file3.txt")
end

local function file4test()
    readfile("/file4.txt")
    writevala("/file4.txt","file4 test")
    readfile("/file4.txt")
    writevalw("/file4.txt","file4 test2")
    --deletefile("/file4.txt")
    readfile("/file4.txt")
end

local function dir3test()
    if rtos.make_dir(USER_DIR3) then
        print("MAKE DIR3 SUCC")
    else
        print("MAKE DIR3 FAIL")
    end
end

local cnt = 0

local str512 = "12345678901234567890123456789012345678901234567890123456789012345678901234567890abcdefghkkll111122222ffssssss33334444455566666777812345678901234567890123456789012345678901234567890123456789012345678901234567890abcdefghkkll111122222ffssssss33334444455566666777812345678901234567890123456789012345678901234567890123456789A012345678901234567890abcdefghkkll111122222ffssssss33334444455566666777812345678901234567890123456789012345678901234567890123456789012345678901234567890abcdefghkkll111122222ffssssss333344444555666667778"
local str = str512..str512
local function filewtest()
    if rt then
        cnt = cnt + 1
    end
    print("get_fs_free_size: cnt"..rtos.get_fs_free_size().." Bytes",cnt)
    writevala("/file1.txt",str)
end

local function emptyfile(filename)
    local filehandle = io.open(filename,"w")
    if filehandle then
        print("successfully empty")
        filehandle:close()
    else
        print("文件不存在或文件输入格式不正确") --打开失败
    end
end

local function filemptest()
    cnt = cnt + 1
    print("get_fs_free_size: cnt"..rtos.get_fs_free_size().." Bytes",cnt)
    emptyfile("/file"..cnt..".txt")
end

local function makedir(dir)
    if rtos.make_dir(dir) then
        print("makedir suc")
    else
        print("makedir fail")
    end
end

local function makedirtest()
    cnt = cnt + 1
    print("get_fs_free_size: cnt"..rtos.get_fs_free_size().." Bytes",cnt)
    makedir("/dir"..cnt)
end

local str10 = str..str..str..str..str..str..str..str..str..str
local function filew10ktest()
    if rt then
        cnt = cnt + 1
    end
    print("get_fs_free_size: cnt"..rtos.get_fs_free_size().." Bytes",cnt)
    writevala("/file"..cnt..".txt",str10)
end

local str100 = str10..str10..str10..str10..str10..str10..str10..str10..str10..str10
local function filew100ktest()
    if rt then
        cnt = cnt + 1
    end
    print("get_fs_free_size: cnt"..rtos.get_fs_free_size().." Bytes",cnt)
    writevala("/file"..cnt..".txt",str100)
end

local function test()
    --filewtest()
    filemptest()
    --makedirtest()
    --filew10ktest()
    --filew100ktest()
end

sys.timerLoopStart(test,1000)

六、开机调试

6.1 开发板开机

连接好硬件并下载固件后,启动 Luatools 软件,系统运行信息将显示在界面中。红框中为开发板连接到 PC 机后正常打印的信息,如下图所示。

6.2 功能调试

首先新建一个文件夹 dir11,在文件夹中新建文件 file11.txt,在 file11.txt 文件中追加数据后保存。查看文件的信息,然后删除整个文件。

获取文件系统的空闲空间和总空间,并计算空闲空间百分比。

测量文件读取和写入操作的时间,执行额外的读写操作并测量其性能。

获取文件系统的空闲空间和总空间,并且不断的新建文件,测试系统的速度和存储响应时间。

七、常见问题

7.1 不同的 core 固件分配的文件系统空间不尽相同

可以参考:https://docs.openluat.com/air724ug/luatos/firmware/ 底层固件功能列表。

可通过 rtos.get_fs_free_size()返回文件系统的剩余空间,单位为字节。

7.2 为什么读文件失败

  • 如果读取的是本地烧录的文件,检查下文件有没有烧录以及路径是否正确。Luatools烧录的文件,访问路径是/ldata/xxx.yyy,例如烧录了 1.txt,访问路径应该是/ldata/1.txt。
  • 如果读取的是程序运行过程中动态创建的文件,检查下文件是否创建成功【文件系统空间不足可能会导致文件创建失败】以及完整路径是否正确。

给读者的话

本篇文章由杨超开发;

本篇文章描述的内容,如果有错误、细节缺失、细节不清晰或者其他任何问题,总之就是无法解决您遇到的问题;

请登录合宙技术交流论坛,点击文档找错赢奖金-Air724UG-LuatOS-软件指南-常用功能实现-文件系统(io)

用截图标注+文字描述的方式跟帖回复,记录清楚您发现的问题;

我们会迅速核实并且修改文档;

同时也会为您累计找错积分,您还可能赢取月度找错奖金!