跳转至

os - os操作

作者:王棚嶙

一、概述

os核心库提供了文件操作、时间日期处理、系统信息获取等核心功能。os 库提供的文件操作接口与 io 库、fatfs 库配合使用可以完成绝大多数文件级操作需求;

二、核心示例

1、核心示例是指:使用本库文件提供的核心 API,开发的基础业务逻辑的演示代码;

2、核心示例的作用是:帮助开发者快速理解如何使用本库,所以核心示例的逻辑都比较简单;

3、更加完整和详细的 demo,请参考 LuatOS 仓库 中各个产品目录下的 demo/tf_card;

-- 文件删除
if os.remove("/sd/test.txt") then
    log.info("os.remove", "文件删除成功")
else
    log.error("os.remove", "文件删除失败")
end

-- 文件重命名
if os.rename("/sd/old.txt", "/sd/new.txt") then
    log.info("os.rename", "文件重命名成功")
else
    log.error("os.rename", "文件重命名失败")
end

三、常量详解

核心库常量,顾名思义是由合宙 LuatOS 内核固件中定义的、不可重新赋值或修改的固定值,在脚本代码中不需要声明,可直接调用;

每个常量对应的常量取值仅做日志打印时查询使用,不要将这个常量取值用做具体的业务逻辑判断,因为LuatOS内核固件可能会变更每个常量对应的常量取值;

如果用做具体的业务逻辑判断,一旦常量取值发生改变,业务逻辑就会出错;

os核心库无常量

四、函数详解

4.1 os.remove(path)

功能

删除文件;

注意事项

1、只能删除文件,不能删除目录;

2、只读文件系统中的文件(/luadb/,以及只读挂载的sd卡)无法删除;

参数

path

参数含义:要删除的文件路径;
数据类型:string
取值范围:有效的文件路径;
是否必选:是;
注意事项:文件必须存在;
参数示例:"/sd/test.txt"

返回值

local success, errmsg = os.remove(path)

有两个返回值

success

含义说明:删除操作结果;
数据类型:boolean
取值范围:true或false
注意事项:暂无;
返回示例:true

errmsg

含义说明:错误信息;
数据类型:string
取值范围:错误描述字符串;
注意事项:失败时返回错误原因;
返回示例:"No such file or directory"

错误码对照表

示例

local success, errmsg = os.remove("/sd/data.txt")
if success then
    log.info("os.remove", "删除成功")
else
    log.error("os.remove", "删除失败", errmsg)
end

4.2 os.rename(old_path, new_path)

功能

文件重命名;

注意事项

1、只能在同一个文件系统内操作;

2、需要源文件存在,且源文件不能是只读属性,如(/luadb/,以及只读挂载的sd卡);

3、目标文件不能已存在,目标文件所在的目录要存在;

参数

path

参数含义:原文件路径;
数据类型:string
取值范围:有效的文件路径;
是否必选:是;
注意事项:文件必须存在;
参数示例:"/sd/old.txt"

new_path

参数含义:目标文件路径;
数据类型:string
取值范围:有效的文件路径;
是否必选:是;
注意事项:路径必须在同一文件系统;
参数示例:"/sd/new.txt"

返回值

local success, errmsg = os.rename(old_path, new_path)

有两个返回值

success

含义说明:重命名操作结果;
数据类型:boolean
取值范围:true或false
注意事项:暂无;
返回示例:true

errmsg

含义说明:错误信息;
数据类型:string
取值范围:错误描述字符串;
注意事项:失败时返回错误原因;
返回示例:"No such file or directory"

错误码对照表

示例

local success, errmsg = os.rename("/sd/temp.txt", "/sd/backup.txt")
if success then
   log.info("os.rename", "重命名成功")
else
   log.error("os.rename", "重命名失败", errmsg)
end

4.3 os.clock()

功能

返回程序使用的按秒计 CPU 时间的近似值;

注意事项

返回的是CPU时间,不是实时时间;

参数

返回值

local cpu_time = os.clock()

有一个返回值

cpu_time

含义说明:程序使用的CPU时间
数据类型:number
取值范围:≥0的数字,单位秒;
注意事项:暂无;
返回示例:1

示例

local start_time = os.clock()
-- 执行一些操作
sys.wait(1000)
local end_time = os.clock()
log.info("os.clock", "CPU时间消耗:", end_time - start_time, "秒")

4.4 os.date(fmt, time)

功能

将时间转换为指定格式的字符串或时间表

注意事项

1、若需要UTC时间,fmt的第一个字符写"!";

2、fmt的格式化遵循 C 函数 strftime;

3、当fmt为"*t"时返回table,否则返回string;

参数

fmt

参数含义:格式化字符串,可参考下方对照表;
数据类型:string或nil
取值范围:strftime格式字符串
是否必选:否;
注意事项:nil时返回默认格式字符串
参数示例:"%Y-%m-%d %H:%M:%S";

格式化符号对照表

含义 示例
%Y 4位数年份 2023
%y 2位数年份 23
%m 2位数月份 1
%d 2位数日期 31
%H 24小时制小时 14
%I 12小时制小时 12
%M 分钟 00-59
%S 秒钟 00-59
%p 上午/下午 AM/PM
%A 星期全名 Sunday
%a 星期缩写 Sun
%B 月份全名 January
%b 月份缩写 Jan
%c 默认格式 Thu Jan 1 00:00:00 1970
! UTC时间前缀 os.date("!%Y-%m-%d %H:%M:%S")

time

参数含义:时间戳;
数据类型:table,当传入time参数时,表的格式为{year, mon, day, hour, min, sec},说明如下;
         {
         -- 参数含义:年份;
         -- 数据类型:number;
         -- 取值范围:通常为4位整数,如2023;
         -- 是否必选:是;
         -- 注意事项:建议使用4位数年份以避免歧义;
         -- 参数示例:2023
         year = ,

        -- 参数含义:月份;
        -- 数据类型:number;
        -- 取值范围:1-12(1代表一月);
        -- 是否必选:是;
        -- 注意事项:无;
        -- 参数示例:1
        mon = ,
        -- 参数含义:日期;
        -- 数据类型:number;
        -- 取值范围:1-31(取决于月份和闰年);
        -- 是否必选:是;
        -- 注意事项:无;
        -- 参数示例:1
        day = ,
        -- 参数含义:小时;
        -- 数据类型:number;
        -- 取值范围:0-23;
        -- 是否必选:否;
        -- 注意事项:默认值为12;
        -- 参数示例:0
        hour = ,
        -- 参数含义:分钟;
        -- 数据类型:number;
        -- 取值范围:0-59;
        -- 是否必选:否;
        -- 注意事项:默认值为0;
        -- 参数示例:0
        min = ,
        -- 参数含义:秒钟;
        -- 数据类型:number;
        -- 取值范围:0-59;
        -- 是否必选:否;
        -- 注意事项:默认值为0;
        -- 参数示例:0
        sec = ,

         }
取值范围:Unix时间戳
是否必选:否,默认为当前时间;
注意事项:暂无;
参数示例:os.time()

返回值

local result = os.date(fmt, time)

有一个返回值

result

含义说明:格式化后的日期时间字符串或日期时间table,fmt为"*t"或者"!*t"时,返回table
         格式为{year, month, day, hour, min, sec, wday, yday,isdst},说明如下;
         {
          -- 参数含义:年份;
         -- 数据类型:number;
         -- 取值范围:为4位整数,如2023;
         -- 注意事项:暂无;
         -- 返回示例:2023
         year = ,

        -- 参数含义:月份;
        -- 数据类型:number;
        -- 取值范围:1-12(1代表一月);
        -- 注意事项:无;
        -- 返回示例:1
        mon = ,

        -- 参数含义:日期;
        -- 数据类型:number;
        -- 取值范围:1-31(取决于月份和闰年);
        -- 注意事项:无;
        -- 返回示例:1
        day = ,

        -- 参数含义:小时;
        -- 数据类型:number;
        -- 取值范围:0-23;
        -- 注意事项:默认值为12;
        -- 返回示例:0
        hour = , 

        -- 参数含义:分钟;
        -- 数据类型:number;
        -- 取值范围:0-59;
        -- 注意事项:默认值为0;
        -- 返回示例:0
        min = ,

        -- 参数含义:秒钟;
        -- 数据类型:number;
        -- 取值范围:0-59;
        -- 注意事项:默认值为0;
        -- 返回示例:0
        sec = ,

        -- 参数含义:星期几;
        -- 数据类型:number;
        -- 取值范围:1-7(1代表星期天,2代表星期一,依此类推);
        -- 注意事项:通常由os.date返回,不是os.time的输入字段;
        -- 返回示例:2
        wday = ,

        -- 参数含义:年份中的第几天;
        -- 数据类型:number;
        -- 取值范围:1-366(取决于闰年);
        -- 注意事项:通常由os.date返回,不是os.time的输入字段;
        -- 参数示例:15
        yday = ,

        -- 参数含义:夏令时标志;
        -- 数据类型:boolean;
        -- 取值范围:true或false;
        -- 注意事项:默认值为nil,表示不使用夏令时;
        -- 参数示例:false
        isdst = ,          
        }
数据类型:string/table
取值范围:格式化字符串或包含日期时间字段的table
注意事项:当fmt为"*t"或者"!*t"时返回table,否则返回string
返回示例:字符串示例:"2024-01-15 14:30:45"
         table示例{year=2024, month=1, day=15, hour=14, min=30, sec=45, wday=2, yday=15,          isdst=false}

示例

-- 获取本地时间字符串
-- 本地时间字符串 Tue Sep 30 00:22:21 2025
log.info("本地时间字符串", os.date())

-- 获取UTC时间字符串  
-- UTC时间字符串 Mon Sep 29 16:22:21 2025
log.info("UTC时间字符串", os.date("!%c"))

-- 格式化本地时间字符串
-- 本地时间字符串 2025-09-30 00:22:21
log.info("本地时间字符串", os.date("%Y-%m-%d %H:%M:%S"))

-- 格式化UTC时间字符串
-- UTC时间字符串 2025-09-29 16:22:21
log.info("UTC时间字符串", os.date("!%Y-%m-%d %H:%M:%S"))

-- 格式化指定时间
local custom_time = os.time({year=2000, mon=1, day=1, hour=0, min=0, sec=0})
-- 自定义时间的字符串 1999-12-31 16:00:00
log.info("自定义时间的字符串", os.date("!%Y-%m-%d %H:%M:%S", custom_time))

-- 获取本地时间的table
-- 本地时间table {"wday":3,"min":22,"yday":273,"hour":0,"isdst":false,"year":2025,"month":9,"sec":21,"day":30}
log.info("本地时间table", json.encode(os.date("*t")))

-- 获取UTC时间的table  
-- UTC时间table {"wday":2,"min":22,"yday":272,"hour":16,"isdst":false,"year":2025,"month":9,"sec":21,"day":29}
log.info("UTC时间table", json.encode(os.date("!*t")))

4.5 os.time(mytime)

功能

将时间表转换为时间戳;

注意事项

暂无;

参数

mytime

参数含义:时间表;
数据类型:table,当mytime为table时的格式为{year, mon, day, hour, min, sec}说明如下;
        {
         -- 参数含义:年份;
         -- 数据类型:number;
         -- 取值范围:为4位整数,如2023;
         -- 是否必选:是;
         -- 注意事项:使用4位数年份以避免歧义;
         -- 参数示例:2023
         year = ,

        -- 参数含义:月份;
        -- 数据类型:number;
        -- 取值范围:1-12(1代表一月);
        -- 是否必选:是;
        -- 注意事项:无;
        -- 参数示例:1
        mon = ,

        -- 参数含义:日期;
        -- 数据类型:number;
        -- 取值范围:1-31(取决于月份和闰年);
        -- 是否必选:是;
        -- 注意事项:无;
        -- 参数示例:1
        day = ,

        -- 参数含义:小时;
        -- 数据类型:number;
        -- 取值范围:0-23;
        -- 是否必选:否;
        -- 注意事项:默认值为12;
        -- 参数示例:0
        hour = , 

        -- 参数含义:分钟;
        -- 数据类型:number;
        -- 取值范围:0-59;
        -- 是否必选:否;
        -- 注意事项:默认值为0;
        -- 参数示例:0
        min = ,

        -- 参数含义:秒钟;
        -- 数据类型:number;
        -- 取值范围:0-59;
        -- 是否必选:否;
        -- 注意事项:默认值为0;
        -- 参数示例:0
        sec = ,
        }
取值范围:包含时间字段的表;
是否必选:否;
注意事项:nil时表示使用当前时间
参数示例:{year=2023, mon=1, day=1, hour=0, min=0, sec=0}

返回值

local timestamp = os.time(mytime)

有一个返回值

timestamp

含义说明:Unix时间戳
数据类型:number
取值范围:≥0的整数;
注意事项:暂无;
返回示例:946656000

示例

local timestamp_a =  os.time({year=2000, mon=1, day=1, hour=0, min=0, sec=0})
-- 自定义时间戳 946656000
log.info("自定义时间戳", timestamp_a)

local timestamp_b = os.time()
-- UTC时间戳 1759161153
log.info("UTC时间戳", timestamp_b)

4.6 os.difftime(timeA, timeB)

功能

计算两个时间戳的差值;

注意事项

1、返回timeA - timeB的差值;

2、支持负数结果;

参数

timeA

参数含义:时间戳A
数据类型:number
取值范围:Unix时间戳
是否必选:是;
注意事项:暂无;
参数示例:os.time()

timeB

参数含义:时间戳B
数据类型:number
取值范围:Unix时间戳
是否必选:是;
注意事项:暂无;
参数示例:os.time({year=2023, mon=1, day=1})

返回值

local difference = os.difftime(timeA, timeB)

有一个返回值

difference

含义说明:时间差值;
数据类型:number
取值范围:整数;
注意事项:单位是秒,time_a - time_b
返回示例:-812504729

示例

local a =  os.time({year=2000, mon=1, day=1, hour=0, min=0, sec=0})
-- 自定义时间戳 946656000
log.info("自定义时间戳", a)

local b = os.time()
-- UTC时间戳 1759161153
log.info("UTC时间戳", b)

local difference = os.difftime(ab)
-- -812504729
log.info("自定义时间戳差值-""UTC时间戳", difference)

五、产品支持说明

支持 LuatOS 开发的所有产品都支持os核心库。