移动.love文件后Love2D项目Lua无法读取文件的解决咨询
Love2D打包.love后io.open失效的解决方案
问题原因
当运行打包好的.love文件时,系统的当前工作目录(CWD)并非.love包内部的文件结构,而是启动.love文件时所在的系统文件夹。io.open是系统级文件操作,会基于这个系统当前目录查找文件,而非从.love包的根目录开始,所以你写的utils/parameters.json路径会指向系统当前目录下的utils文件夹,自然找不到包内的文件。
而在原项目文件夹运行时,系统当前工作目录正好是项目根目录,因此io.open能正常找到文件。
正确解决方案:使用love.filesystem模块
Love2D专门提供love.filesystem模块处理包内文件资源,它会自动从.love包的根目录(与main.lua同层级的位置)解析路径,不受系统当前工作目录影响。
修改JSONHandler.lua的代码
将原io.open的代码替换为love.filesystem的API,示例如下:
原错误代码片段:
local file = io.open(self.filename, "r") local content = file:read("a")
替换为简洁的直接读取方式:
local content, err_msg = love.filesystem.read(self.filename) if not content then error("读取parameters.json失败: " .. err_msg) end
若需要逐行读取等复杂操作,可使用文件对象方式:
local file, err_msg = love.filesystem.newFile(self.filename, "r") if not file then error("打开parameters.json失败: " .. err_msg) end local content = file:read("a") file:close() -- 操作完成后关闭文件
你的Handler.filename = "utils/parameters.json"路径无需修改,因为love.filesystem会从包的根目录开始查找,与项目结构完全匹配。
特殊情况:需要修改并保存parameters.json
如果parameters.json是需用户修改、程序写入的配置文件,不能放在.love包内(.love是只读压缩包),需将文件复制到Love2D的保存目录后再读写:
Handler = { -- 包内的原始配置文件路径 default_filename = "utils/parameters.json", -- 保存目录的配置文件路径 save_filename = love.filesystem.getSaveDirectory() .. "/parameters.json", params = {}, ... } function Handler:init() local o = {} setmetatable(o, self) self.__index = self -- 检查保存目录是否有配置文件,无则从包内复制 if not love.filesystem.getInfo(self.save_filename) then local default_content = love.filesystem.read(self.default_filename) love.filesystem.write(self.save_filename, default_content) end -- 读取保存目录的配置文件 local content, err_msg = love.filesystem.read(self.save_filename) if not content then error("读取配置文件失败: " .. err_msg) end -- 后续解析content的逻辑不变 ... end
love.filesystem.getSaveDirectory()会返回Love2D为游戏分配的专属可读写保存路径,不同系统路径不同,但均保证可正常读写。
内容的提问来源于stack exchange,提问作者Capnsockless
相关产品推荐
相关产品推荐

