代码之家  ›  专栏  ›  技术社区  ›  PeterMmm

使用lua,检查文件是否是目录

lua
  •  4
  • PeterMmm  · 技术社区  · 14 年前

    如果我有这个密码

    local f = io.open("../web/", "r")
    print(io.type(f))
    
    -- output: file
    

    我怎么知道 f 指向目录?

    7 回复  |  直到 8 年前
        1
  •  5
  •   Amber    14 年前

    Lua的默认库无法确定这一点。

    但是,您可以使用第三方 LuaFileSystem 库可以访问更高级的文件系统交互;它也是跨平台的。

        2
  •  9
  •   Mark Rushakoff    14 年前

    ANSIC没有指定任何获取目录信息的方法,所以普通的Lua不能告诉您这些信息(因为Lua力求100%的可移植性)。但是,您可以使用外部库,例如 LuaFileSystem 以标识目录。

    Progamming in Lua 甚至明确说明了缺少的目录功能:

    作为一个更复杂的例子,让我们编写一个返回给定目录内容的函数。Lua在其标准库中不提供此函数,因为ANSIC没有此作业的函数。

    该示例将继续演示如何编写 dir 在C中发挥作用。

        3
  •  6
  •   blueyed    9 年前

    我在我使用的库中发现了这段代码:

    function is_dir(path)
        local f = io.open(path, "r")
        local ok, err, code = f:read(1)
        f:close()
        return code == 21
    end
    

    我不知道Windows中的代码是什么,但在Linux/BSD/OSX上,它工作得很好。

        4
  •  5
  •   lhf    14 年前

    如果你这样做了

    local x,err=f:read(1)
    

    然后你就会得到 "Is a directory" 在里面 err .

        5
  •  2
  •   sshbio    8 年前

    至少对于Unix:

    if os.execute("cd '" .. f .. "'")
    then print("Is a dir")
    else print("Not a dir")
    end
    

    :)

        6
  •  0
  •   Marumaru    12 年前
    function fs.isDir ( file )
    if file == nil then return true end
    if fs.exists(file) then
        os.execute("dir \""..userPath..file.."\" >> "..userPath.."\\Temp\\$temp")
        file = io.open(userPath.."\\Temp\\$temp","r")
        result = false
        for line in file:lines() do
            if string.find(line, "<DIR>") ~= nil then
                result = true
                break
            end
        end
        file:close()
        fs.delete("\\Temp\\$temp")
        if not (result == true or result == false) then
            return "Error"
        else
            return result
        end
    else
        return false
    end
    end
    

    这是我从我之前找到的一个库中提取的代码。

        7
  •  0
  •   blueyed    9 年前

    这首先检查是否可以读取路径(也就是 nil 对于空文件),然后检查大小是否为0。

    function is_dir(path)
        f = io.open(path)
        return not f:read(0) and f:seek("end") ~= 0
    end