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
精彩评论