VLC Lua扩展编辑vlcrc文件报错:参数类型错误排查修复
问题:VLC Lua扩展修改vlcrc录制路径时的io.lines错误
用户开发VLC Lua扩展,通过「VLC > 视图 > 编辑录制保存路径」菜单项修改%APPDATA%\vlc\vlcrc文件,调试确认已正确获取vlcrc文件路径,但执行for line in io.lines(file) do语句时抛出错误:
<codefile>.lua:47: bad argument #1 to 'lines' (string expected, got userdata)
错误原因分析
- 核心错误:
io.lines()函数要求传入的参数是文件路径字符串,但你传入的是io.open()返回的文件句柄(userdata类型),类型不匹配导致报错。 - 额外潜在问题:
- 用
w+模式打开vlcrc会直接清空原文件,丢失所有原有配置 gsub处理后的行内容没有写入目标文件,修改操作无效- 路径中的单斜杠
\未转义,会被Lua解析为转义字符,导致路径错误 - 硬编码的
<Username>无法适配不同用户,需要动态处理
- 用
修复后的完整代码
function descriptor() return { title = "VLC Edit Record Dir"; version = "0.0.1"; author = "vicky-dev"; shortdesc = "&Edit the path for saving recordings"; } end function main_fn() local item = (vlc.player or vlc.input).item() if not item then vlc.msg.err("[VLC Edit Record Dir] No media is playing!") return end local fname_tmp = item:uri():match("([^/\\]*)$") local file_name = vlc.strings.decode_uri(fname_tmp) -- 移除文件名中的Windows非法字符,避免路径错误 file_name = file_name:gsub("[%:%*%?%\"%<%>%|]", "_") edit_vlcrc_file(file_name) end function activate() main_fn() end function deactivate() end function close() end function write_file(data) local file_path = vlc.config.userdatadir() .. "/VLC_Current_Playing.txt" -- 忽略删除失败(文件不存在时) pcall(os.remove, file_path) local file = io.open(file_path, "w") if file then file:write('Current Media File: '..data) file:close() vlc.msg.dbg("[VLC Edit Record Dir] Wrote debug info to "..file_path) else vlc.msg.err("[VLC Edit Record Dir] Failed to open debug file!") end end function edit_vlcrc_file(videoName) local vlcRc = vlc.config.userdatadir() .. "\\vlcrc" write_file(vlcRc) -- 先读取原文件所有内容 local lines = {} for line in io.lines(vlcRc) do -- 匹配input-record-path配置行,支持注释或未注释的情况 local modified_line = line:gsub("^%s*#?%s*input-record-path=.*", "input-record-path="..vlc.strings.encode_uri("C:\\Users\\"..os.getenv("USERNAME").."\\Videos\\CustomFolder\\"..videoName)) table.insert(lines, modified_line) end -- 写入修改后的内容 local file = io.open(vlcRc, "w") if file then file:write(table.concat(lines, "\n")) file:close() vlc.msg.dbg("[VLC Edit Record Dir] Updated recording path successfully") else vlc.msg.err("[VLC Edit Record Dir] Failed to open vlcrc file for writing!") end end
修复说明
- 修正io.lines调用:直接传入vlcrc文件路径字符串,而非文件句柄
- 保留原有配置:先读取所有行内容,修改目标行后再整体写入,避免清空文件
- 动态获取用户名:用
os.getenv("USERNAME")获取当前系统用户名,替换硬编码的<Username> - 路径转义:将路径中的
\改为\\,确保Lua正确解析 - 错误处理:增加媒体不存在、文件打开失败的错误提示,用
pcall避免删除不存在文件时崩溃 - 非法字符处理:移除文件名中的Windows非法字符,防止路径无效
内容的提问来源于stack exchange,提问作者Vicky Dev
相关产品推荐
相关产品推荐

