需要使用lfs库,需要注意的是,lfs库在windows下使用的是ANSI编码,不是unicode编码,因此文件字符串是ansi格式。必要时需要使用iconv库转换成其它格式比如utf8
lua脚本遍历目录的算法,查找目录下所有指定扩展名的文件
-- 引入 lfs 库
local lfs = require("lfs")
-- 定义遍历目录的函数
local function traverseDir(path, extension)
for file in lfs.dir(path) do
if file ~= "." and file ~= ".." then
-- 文件目录加文件名等于文件路径
local filePath = path .. file
local attr = lfs.attributes(filePath)
if attr.mode == "directory" then
-- 递归遍历子目录
traverseDir(filePath .. "/", extension)
elseif attr.mode == "file" and file:match(".*"..extension.."$") then
-- 输出符合条件的文件名
print(filePath)
end
end
end
end
-- 调用函数开始遍历目录 %是转义字符表示字符'.',而不是通配符'.'
-- 目录后要有斜杠/
traverseDir("./", "%.md")
lfs.attributes 函数返回给定路径的文件或目录的属性。它可以接受一个路径作为参数,并返回一个包含各种属性的表。
以下是 lfs.attributes 返回的属性列表:
dev:设备 ID
ino:inode 号
mode:文件模式
nlink:链接数目
uid:所有者用户 ID
gid:所有者组 ID
rdev:设备类型(如果是特殊文件)
access:上次访问时间
modification:上次修改时间
change:上次状态改变时间
creation:创建时间
size:文件大小(字节数)
blocks:文件占用的磁盘块数
blksize:磁盘块大小
遍历目录所有文件
--遍历目录
local lfs = require("lfs")
--目录末尾要带'/'
local function traverseDirectory(path)
local files = {}
for file in lfs.dir(path) do
if file ~= "." and file ~= ".." then
local filepath = path .. file
local mode = lfs.attributes(filepath, "mode")
if mode == "file" then
table.insert(files, filepath)
elseif mode == "directory" then
local subFiles = traverseDirectory(filepath..'/')
for _, subFile in ipairs(subFiles) do
table.insert(files, subFile)
end
end
end
end
return files
end
local directory = "./"
local files = traverseDirectory(directory)
for _, file in ipairs(files) do
print(file)
end提取最后的目录名
需要路径是最后以'/'结尾,并且目录分隔符是'/'。
判断文件或者目录存在
local lfs = require("lfs")
-- 判断文件是否存在
function fileExists(filePath)
local file = io.open(filePath, "r")
if file then
io.close(file)
return true
end
return false
end
-- 判断目录是否存在
function dirExists(dirPath)
local attrs = lfs.attributes(dirPath)
return attrs and attrs.mode == "directory"
end
-- 测试
local filePath = "/path/to/file.txt"
local dirPath = "/path/to/dir"
if fileExists(filePath) then
print(filePath .. " exists")
else
print(filePath .. " does not exist")
end
if dirExists(dirPath) then
print(dirPath .. " exists")
else
print(dirPath .. " does not exist")
end
lua打印指定目录下所有目录名
-- 引入 lfs 库
local lfs = require("lfs")
local function getDirectories(path)
local directories = {}
for entry in lfs.dir(path) do
local fullpath = path .. entry
local attr = lfs.attributes(fullpath)
if attr and attr.mode == "directory" and entry ~= "." and entry ~= ".." then
table.insert(directories, entry)
end
end
return directories
end
-- 指定目录路径
local directoryPath = "../Webs/"
-- 获取目录名
local directories = getDirectories(directoryPath)
-- 打印目录名
for _, directoryName in ipairs(directories) do
print(directoryName)
end
打印指定目录下所有文件名
-- 引入 lfs 库
local lfs = require("lfs")
local function getFiles(path)
local files = {}
for entry in lfs.dir(path) do
local fullpath = path .. entry
local attr = lfs.attributes(fullpath)
if attr and attr.mode == "file" then
table.insert(files, entry)
end
end
return files
end
-- 指定目录路径
local directoryPath = "./"
-- 获取文件名
local files = getFiles(directoryPath)
-- 打印文件名
for _, fileName in ipairs(files) do
print(fileName)
end去除文件扩展名
local name = "abc.txt"
--去除扩展名
local idx = name:match(".+()%.%w+$")
if idx then name = name:sub(1, idx - 1) end
print(name)整除
lua中“ / ”代表除法,计算结果都是存在小数的。
lua数学库提供了三个取整函数
math.floor(),math.ceil()和math.modf()
math.floor()向负无穷取整
math.ceil()向正无穷取证
modf向零取整(有两个返回值,返回整数与小数部分)