当前位置:

首页 > 编程开发 > lua文件操作详解

lua文件操作详解

Lua文件操作分为io表和文件句柄两种调用方式,前者适合快速读写,后者便于精细控制。常用函数包括io.open、file:read、file:write、file:seek等,并需注意及时关闭文件句柄。实战中常封装读取、写入、获取大小和检查存在等函数。

本文目录

    Lua文件操作:两种调用方式,一次讲透

    Lua的I/O库其实只提供了两种文件处理路径,但很多新手会在两者之间犯迷糊。一种是通过io表来操作,另一种是直接操作文件句柄。先说结论:前者适合快速读写,后者适合精细控制。两者的核心区别在于——你用io.open拿到一个文件描述后,后续所有操作都是围绕这个描述进行的;而io表本身还预置了三个默认文件描述:io.stdin、io.stdout、io.stderr。多数I/O函数在调用失败时会返回nil外加错误信息,有些函数成功时反而返回nil,这得特别留意。

    lua文件操作详解

    io表调用方式

    使用io.open打开文件,拿到文件句柄后,所有的读写都围绕这个句柄展开。而io表自带的三个预定义句柄——io.stdin、io.stdout、io.stderr——可以直接用于输入输出,省去手动打开的步骤。

    文件句柄直接调用方式

    也就是用file:XXX()的形式进行调用,这里的file就是io.open()返回的文件句柄。这种写法更直观,也更容易控制资源的生命周期。


    IO核心函数全解析

    io.close ([file])
    关闭文件。如果不传参数,则关闭默认输出文件。

    io.flush ()
    相当于file:flush(),把缓冲区里所有内容强制写入默认输出文件。这在需要确保数据即时落盘时非常有用。

    io.lines ([filename])
    打开指定文件为读模式,返回一个迭代函数。每次调用迭代函数,会返回文件中的一行内容;读到文件尾时返回nil,并自动关闭文件。如果不带参数,io.lines()等价于io.input():lines(),从默认输入设备读取内容,但结束时不自动关闭文件。来看一个典型用法:

    for line in io.lines("main.lua") do
      print(line)
    end
    

    io.open (filename [, mode])
    这是最常用的函数。参数mode决定了打开方式:

    • "r":读模式,默认值。
    • "w":写模式,会清空文件。
    • "a":追加模式,从文件尾开始写。
    • "r+":更新模式,保留原有数据。
    • "w+":更新模式,但会清除原有数据。
    • "a+":追加更新模式,保留原有数据,只允许在文件尾添加。
    • "b":二进制模式,某些系统下需要加上这个标志。

    io.read (...)
    按格式读取输入。后面在file:read部分会详细说明格式。

    io.type (obj)
    检测一个对象是否为可用的文件句柄。返回值有三种:

    • "file":表示一个打开的文件句柄。
    • "closed file":表示一个已关闭的文件句柄。
    • nil:表示根本不是文件句柄。

    io.write (...)
    相当于io.output():write(...),向默认输出文件写入内容。


    File对象的方法

    file:close()
    关闭文件句柄。需要注意的是,当文件句柄被垃圾回收时,文件也会自动关闭,但此时句柄会变成一个不可预知的值,所以最好显式调用close。

    file:flush()
    把缓冲区中所有数据写入文件。在写文件时,如果不调用flush,数据可能还留在内存里没真正落盘。

    file:lines()
    返回一个迭代函数,用法和io.lines类似,但不会自动关闭文件。每次调用返回文件中的一行,到文件尾返回nil。

    for line in file:lines() do
      -- 处理每一行
    end
    

    file:read(...)
    按指定格式读取文件。每个格式返回一个字符串或数字;如果无法正确读取则返回nil;不指定格式时默认按行读取。支持的格式:

    • "n":读取一个数字。
    • "a":从当前位置读取整个文件,如果已是文件尾则返回空字符串。
    • "l":默认值,读取下一行,文件尾时返回nil。
    • number:读取指定字节数的字符,如果已是文件尾则返回nil;若数字为0则返回空字符串。

    file:seek([whence] [, offset])
    设置或获取当前文件位置。成功返回最终位置(按字节),失败返回nil加错误信息。参数whence有三种:

    • "set":从文件头开始计算。
    • "cur":从当前位置开始(默认)。
    • "end":从文件尾开始。

    offset默认为0。不带参数调用file:seek()返回当前位置;file:seek("set")定位到文件头;file:seek("end")定位到文件尾并返回文件大小。这个函数常用于计算文件长度或实现随机读写。

    file:write(...)
    按指定参数向文件写入内容。参数必须是字符串或数字。如果需要写入其他类型,得先用tostring或string.format转换。


    实战:四个常用函数封装

    下面这几个函数在实际项目中几乎每天都会用到,直接拿过去用就行。

    读取文件所有内容

    function readfile(path)
      local file = io.open(path, "r")
      if file then
        local content = file:read("*a")
        io.close(file)
        return content
      end
      return nil
    end
    

    写入内容到文件

    function writefile(path, content, mode)
      mode = mode or "w+b"
      local file = io.open(path, mode)
      if file then
        if file:write(content) == nil then return false end
        io.close(file)
        return true
      else
        return false
      end
    end
    

    获取文件大小

    -- @return : 文件字节数
    function filesize(path)
      local size = false
      local file = io.open(path, "r")
      if file then
        local current = file:seek()
        size = file:seek("end")
        file:seek("set", current)
        io.close(file)
      end
      return size
    end
    

    检查文件是否存在

    function fileExists(path)
      local file = io.open(path, "r")
      if file then
        io.close(file)
        return true
      end
      return false
    end
    

    以上这些就是Lua I/O库最核心的内容。实际开发中,只要记住两条:一是分清io表和句柄调用的差异,二是记得及时关闭文件句柄,基本就不会出大问题。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发
    相关文章 更多
    编程语言的编程模型
    编程语言的编程模型

    编程模型涵盖面向过程的C语言、面向对象的Ruby、基于栈的PostScript、基于规则的Prolog、基于原型的Lua、函数式的Erlang/Haskell及混合模型的Scala/Clojure。类型系统区分强类型与弱类型、动态类型与静态类型,元编程允许运行时操作代码,提升表达力。

    lua 如何获取指定路径下的所有文件夹
    lua 如何获取指定路径下的所有文件夹

    Lua编程语言轻量级且小巧,可用io.popen执行系统命令获取指定路径下所有文件夹:在Windows系统下使用dir/b/s命令,在Unix系统下使用find-typef命令。然而官方更推荐使用lfs库进行递归遍历,通过lfs.dir和lfs.attributes函数筛选目录,此法避免系统命令依赖,代码简洁且跨平台效果更佳。

    lua调用C/C++的方法详解
    lua调用C/C++的方法详解

    Lua通过虚拟栈与C/C++交互,将C函数封装为接口供其调用。调用时,C从栈中获取参数并返回结果,参数传递与结果返回均通过栈操作完成,从而实现了Lua对C能力的高效、便捷调用,使得Lua能无缝利用C语言的高性能库。

    详解Lua中的元表和元方法
    详解Lua中的元表和元方法

    一、元表 元表是Lua中一个挺有意思的机制——它允许我们在一个值遇到未知操作时,给出自定义的行为。本质上,元表也是用table来承载的,所以熟悉了table,也就掌握了元表的基本用法。 不过得注意,元表只能针对一组预先定义好的操作集合做扩展,比面向对象中的类要受限得多。最典型的一点:元表不支持继承。

    如何使用Vim搭建Lua开发环境详解
    如何使用Vim搭建Lua开发环境详解

    基于SpaceVim搭建Lua开发环境,需先安装Neovim、Nerd字体及支持真色的终端,启用lang#lua模块后,即可获得全面的代码补全、语法检查、工程文件跳转、一键运行、代码格式化及交互式编程等高效开发功能,大幅提升编程效率与体验。

    Luvit像Node.js一样写Lua应用
    Luvit像Node.js一样写Lua应用

    先问个问题:如果你是一个Lua开发者,手头刚好有异步I/O的需求,你会怎么办?传统方案当然有,但要说最接近Node.js体验的,还得是Luvit。简单来说,它就是Lua界的Node.js——把Lua和libUV撮合在一起,再加上JIT加持,用项目自己的话说:Lua + libUV + JIT = p

    Lua流程控制语句if else的使用示例
    Lua流程控制语句if else的使用示例

    Lua的流程控制,if和if else是基础。和C语言很像,if语句支持嵌套,也能和循环配合——比如在循环体内根据条件决定是否跳出,这在日常开发中非常实用。 1、if语句 先看最基本的if语法结构: if(布尔表达式) then --[ 在布尔表达式为 true 时执行的语句 --] end 来看一

    Lua中pairs与ipairs的区别总结
    Lua中pairs与ipairs的区别总结

    最近在写一个流量转发的东西,用到了 nginx_lua_module 这个模块,需要根据 Header、Body 和 Cookie,按照流量比例把请求转发到其他地方。翻看前人留下的代码,发现循环遍历时,有时候用 pairs,有时候用 ipairs,风格并不统一,读起来让人有点困惑。 好在 Lua 官

    Lua游戏开发教程之时区问题详解
    Lua游戏开发教程之时区问题详解

    通过Lua的os.date("!*t")获取UTC时间,结合服务器时区差值,可将游戏内时间统一显示为服务器所在地时间。计算活动倒计时时,需考虑本地时区与服务器时区的差异,转换时间戳后得到准确剩余时间。正确处理时区问题能解决多语种发行中的显示同步难题。

    深入谈谈lua中神奇的table
    深入谈谈lua中神奇的table

    Lua中的table可作为字典、数组、环境、模块、对象和类使用。字典支持任意非nil键类型,遍历无序;数组索引从1开始,#对空洞处理需谨慎。table掌管全局环境_G和局部环境_ENV,模块本质为table。对象通过闭包实现私有成员,冒号语法糖简化self传递;类借助元表__index实现继承。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。