
1. 创建并写入文件
创建并写入文件是最基本的文件操作,可以使用写入模式('w')打开文件,然后使用write方法写入内容。
lua
-- 定义示例文件路径
local testFilePath = "test_file.txt"
-- 打开文件进行写入('w' 模式:写入模式,如果文件存在则覆盖)
local file, err = io.open(testFilePath, "w")
if file then
-- 写入内容
file:write("这是第一行内容\n")
file:write("这是第二行内容\n")
file:write("这是第三行内容\n")
-- 格式化写入
local name = "Lua"
local version = 5.4
file:write(string.format("欢迎使用 %s %s!\n", name, version))
-- 关闭文件
file:close()
print("文件写入成功: " .. testFilePath)
else
print("文件打开失败: " .. err)
end
2. 读取整个文件
读取整个文件可以使用读取模式('r')打开文件,然后使用read方法读取全部内容。
lua
-- 打开文件进行读取('r' 模式:读取模式)
file, err = io.open(testFilePath, "r")
if file then
-- 读取整个文件
local content = file:read("*a") -- "*a" 表示读取整个文件内容
file:close()
print("文件内容:")
print(content)
else
print("文件打开失败: " .. err)
end
3. 逐行读取文件
当文件较大时,逐行读取是更高效的方法,可以使用lines()迭代器来实现。
lua
file, err = io.open(testFilePath, "r")
if file then
print("逐行读取:")
local lineNumber = 1
-- 逐行读取,直到文件结束
for line in file:lines() do -- 使用 lines() 迭代器
print("行 " .. lineNumber .. ": " .. line)
lineNumber = lineNumber + 1
end
file:close()
else
print("文件打开失败: " .. err)
end
4. 追加内容到文件
追加模式('a')允许在不覆盖现有内容的情况下,在文件末尾添加新内容。
lua
-- 打开文件进行追加('a' 模式:追加模式,如果文件不存在则创建)
file, err = io.open(testFilePath, "a")
if file then
file:write("\n这是追加的第一行\n")
file:write("这是追加的第二行\n")
file:close()
print("内容追加成功")
else
print("文件打开失败: " .. err)
end
-- 验证追加结果
print("\n追加后的文件内容:")
file = io.open(testFilePath, "r")
print(file:read("*a"))
file:close()
5. 二进制文件操作
二进制模式('b')用于处理非文本文件,可以与写入或读取模式组合使用。
lua
-- 写入二进制数据
file, err = io.open("binary_test.dat", "wb") -- 'wb' 模式:二进制写入
if file then
-- 写入字符串作为二进制数据
file:write("Hello Binary\n")
-- 写入数字(注意:Lua 不会自动转换,这里依然是写入字符串形式)
for i = 1, 5 do
file:write(i .. "\n")
end
file:close()
print("二进制文件写入成功")
end
-- 读取二进制文件
file, err = io.open("binary_test.dat", "rb")
if file then
print("二进制文件读取:")
print(file:read("*a"))
file:close()
end
6. 文件复制操作
文件复制需要分块读取源文件并写入目标文件,特别是对于大文件更高效。
lua
function copyFile(source, destination)
local sourceFile, sourceErr = io.open(source, "rb")
if not sourceFile then
return false, "源文件打开失败: " .. sourceErr
end
local destFile, destErr = io.open(destination, "wb")
if not destFile then
sourceFile:close()
return false, "目标文件打开失败: " .. destErr
end
-- 分块读取并写入,避免大文件占用过多内存
local blockSize = 4096 -- 4KB 块
while true do
local data = sourceFile:read(blockSize)
if not data then
break -- 文件读取完毕
end
destFile:write(data)
end
-- 关闭文件
sourceFile:close()
destFile:close()
return true
end
-- 执行文件复制
local copyFilePath = "test_file_copy.txt"
local success, msg = copyFile(testFilePath, copyFilePath)
if success then
print("文件复制成功: " .. testFilePath .. " -> " .. copyFilePath)
-- 验证复制结果
print("\n复制文件内容:")
file = io.open(copyFilePath, "r")
print(file:read("*a"))
file:close()
else
print(msg)
end
7. 获取文件信息
获取文件信息通常需要使用LuaFileSystem (lfs)库,它提供了丰富的文件和目录操作功能。
lua
-- 使用 lfs 库获取文件信息(注意:需要安装 LuaFileSystem 库)
print([[获取文件信息通常需要使用 LuaFileSystem (lfs) 库,使用方法如下:
local lfs = require "lfs"
-- 获取文件属性
local attr = lfs.attributes(testFilePath)
if attr then
print("文件大小: " .. attr.size .. " 字节")
print("文件类型: " .. attr.mode)
print("创建时间: " .. os.date("%Y-%m-%d %H:%M:%S", attr.ctime))
print("修改时间: " .. os.date("%Y-%m-%d %H:%M:%S", attr.mtime))
print("访问时间: " .. os.date("%Y-%m-%d %H:%M:%S", attr.atime))
end
-- 检查文件是否存在
function fileExists(path)
local attr = lfs.attributes(path)
return attr and attr.mode == "file"
end
-- 检查目录是否存在
function directoryExists(path)
local attr = lfs.attributes(path)
return attr and attr.mode == "directory"
end
]])
8. io 库的快捷函数
Lua的io库提供了一些便捷函数,用于简化常见的I/O操作。
lua
-- io.write() 直接写入标准输出
print("使用 io.write() 输出:")
io.write("这是使用 io.write() 写入的内容\n")
io.write("可以多次调用 io.write()\n")
-- io.read() 从标准输入读取
print("\n提示: 在实际运行时,你可以使用 io.read() 从键盘读取输入,例如:")
print([[print("请输入你的名字:")
local name = io.read()
print("你好," .. name .. "!")
]])
-- io.tmpfile() 创建临时文件
print("\n创建临时文件示例:")
local tempFile = io.tmpfile()
if tempFile then
tempFile:write("这是临时文件内容\n")
tempFile:seek("set") -- 移动到文件开头
print("临时文件内容:", tempFile:read("*a"))
tempFile:close() -- 临时文件在关闭时会被自动删除
print("临时文件已关闭并自动删除")
end
9. 文件指针操作
文件指针操作允许在文件的特定位置进行读写,提供了更灵活的文件访问方式。
lua
file = io.open(testFilePath, "r")
if file then
-- 读取前 10 个字符
local first10 = file:read(10)
print("前 10 个字符: " .. first10)
-- 获取当前位置
local currentPos = file:seek()
print("当前文件指针位置: " .. currentPos)
-- 移动到文件开头
file:seek("set", 0)
print("移动到开头后读取第一行: " .. file:read("*l")) -- "*l" 表示读取一行
-- 移动到文件末尾
local fileSize = file:seek("end")
print("文件大小: " .. fileSize .. " 字节")
-- 移动到文件中间位置
file:seek("set", fileSize / 2)
print("从中间位置读取的内容: " .. file:read("*l"))
file:close()
end
10. 清理示例文件
在操作完成后,及时清理创建的临时文件是良好的实践。
lua
-- 使用 os.remove 删除文件
local function deleteFile(filePath)
local success, err = os.remove(filePath)
if success then
print("文件已删除: " .. filePath)
else
print("文件删除失败: " .. filePath .. " - " .. err)
end
end
deleteFile(testFilePath)
deleteFile(copyFilePath)
deleteFile("binary_test.dat")
11. 文件操作总结
11.1 文件打开模式
写入模式 ('w'): 创建文件或覆盖现有文件
读取模式 ('r'): 读取现有文件
追加模式 ('a'): 在文件末尾添加内容
二进制模式 ('b'): 与 'w' 或 'r' 结合使用
读写模式 ('r+'): 打开文件进行读取和写入
11.2 文件操作最佳实践
-
始终关闭文件:使用完文件后,务必调用close()方法关闭文件,避免资源泄漏。
-
错误处理:在打开和操作文件时,始终检查可能的错误情况。
-
大文件处理:对于大文件,使用分块读取和写入,避免一次性加载整个文件到内存。
-
二进制文件:处理二进制文件时,使用二进制模式('b')。
-
文件指针:使用seek()方法进行精确的文件定位操作。
-
临时文件:使用io.tmpfile()创建临时文件,在程序结束或显式关闭时会自动清理。
学习总结
文件操作是Lua程序中常用的功能之一。通过本文件介绍的各种文件操作方法,你可以有效地读写文件、处理二进制数据、复制文件内容以及管理文件指针。在实际开发中,应根据具体需求选择合适的文件操作模式和方法,并始终注意错误处理和资源管理,以编写更健壮的程序。