开发者

Using Lua, check if file is a directory

开发者 https://www.devze.com 2022-12-30 12:02 出处:网络
If I have this code local f = io.open(\"../web/\", \"r\") print(io.type(f)) 开发者_如何学Python-- output: file

If I have this code

local f = io.open("../web/", "r")
print(io.type(f))

开发者_如何学Python-- output: file

how can I know if f points to a directory?


ANSI C does not specify any way to obtain information on a directory, so vanilla Lua can't tell you that information (because Lua strives for 100% portability). However, you can use an external library such as LuaFileSystem to identify directories.

Progamming in Lua even explicitly states about the missing directory functionality:

As a more complex example, let us write a function that returns the contents of a given directory. Lua does not provide this function in its standard libraries, because ANSI C does not have functions for this job.

That example moves on to show you how to write a dir function in C yourself.


I've found this piece of code inside a library I use:

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

I don't know what the code would be in Windows, but on Linux/BSD/OSX it works fine.


if you do

local x,err=f:read(1)

then you'll get "Is a directory" in err.


Lua's default libraries don't have a way to determine this.

However, you could use the third-party LuaFileSystem library to gain access to more advanced file-system interactions; it's cross-platform as well.

LuaFileSystem provides lfs.attributes which you can use to query the file mode:

require "lfs"
function is_dir(path)
    -- lfs.attributes will error on a filename ending in '/'
    return path:sub(-1) == "/" or lfs.attributes(path, "mode") == "directory"
end


At least for UNIX:

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

:)


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

This is some code I pulled from a library I found earlier.


This checks first if the path can be read (which also is nil for empty files) and then checks that the size is not 0 additionally.

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


As the question doesn't specify the need of portability, on Linux/Unix systems you can relieve on file command:

function file(path)
  local p = io.popen(('file %q'):format(path))
  if p then
    local out = p:read():gsub('^[^:]-:%s*(%w+).*','%1')
    p:close()
    return out
  end
end

if file('/') == 'directory' then
  -- do something
end

Tested and worked from Lua 5.1 to 5.4

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号