lua遍历目录、提取文件名、判断文件存在等操作

⌚Time: 2024-04-10 02:30:00

👨‍💻Author: Jack Ge

需要使用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 function getFinalDriInPath(path)
    return path:match("/([^/]+)/$")
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向零取整(有两个返回值,返回整数与小数部分)