如何检查lua中是否存在目录,如果可能,最好不使用LuaFileSystem模块?
尝试做类似这样的python行:
os.path.isdir(path)
答案 0 :(得分:12)
问题在于,Lua分布(几乎)仅包含标准C中指定的功能。标准C没有假设实际存在任何特定类型的文件系统(甚至是操作系统,用于那么重要),os
和io
模块不提供标准C库中没有的访问信息。
如果您尝试使用纯标准C进行编码,则会出现同样的问题。
您可以通过尝试使用该文件夹来了解该文件夹是否存在。如果您希望它存在并且可以写入,则在那里创建一个临时文件,如果成功,则该文件夹存在。如果失败,您当然可能无法将不存在的文件夹与权限不足区分开来。
到目前为止,获得特定答案的最轻量级答案将是对仅提供所需信息的特定于操作系统的函数调用的精简绑定。如果你可以接受lua alien模块,那么你可以在其他纯粹的Lua中进行绑定。
更简单,但稍重,是接受Lua文件系统。它提供了一个便携式模块,支持大多数人可能想要了解的文件和文件系统。
答案 1 :(得分:11)
这种方法适用于Unix和Windows,没有任何外部依赖关系:
--- Check if a file or directory exists in this path
function exists(file)
local ok, err, code = os.rename(file, file)
if not ok then
if code == 13 then
-- Permission denied, but it exists
return true
end
end
return ok, err
end
--- Check if a directory exists in this path
function isdir(path)
-- "/" works on both Unix and Windows
return exists(path.."/")
end
答案 2 :(得分:9)
如果您对避免LFS库特别感兴趣,Lua Posix library有一个stat()接口。
require 'posix'
function isdir(fn)
return (posix.stat(fn, "type") == 'directory')
end
答案 3 :(得分:5)
嗯,5.1参考手册在the os table中没有任何内容,但如果您使用Nixstaller,则会得到os.fileexists
,这正是您所解释的内容。
如果你有能力摆弄一下,或者如果你知道你将运行什么操作系统,你可能会使用标准的os库os.execute
通过一些系统调用来识别文件是否正确存在。
甚至比os.execute更好的可能是os.rename:
os.rename(oldname, newname)
将名为
oldname
的文件重命名为newname
。 如果此函数失败,则返回 nil,加上描述的字符串 错误。
您可以尝试将oldname和newname设置为相同 - 但您可能没有写入权限,因此即使您可以读取,也可能因为无法写入而失败。在那种情况下,您必须解析返回的错误字符串并推断您是否可以编写,或者您只需尝试执行需要现有文件的函数,并将其包装在pcall
中。 / p>
答案 4 :(得分:4)
您也可以使用'paths'包。 Here是包
的链接然后在Lua做:
require 'paths'
if paths.dirp('your_desired_directory') then
print 'it exists'
else
print 'it does not exist'
end
答案 5 :(得分:2)
这是针对Windows平台测试的。实际上很容易:
local function directory_exists( sPath )
if type( sPath ) ~= "string" then return false end
local response = os.execute( "cd " .. sPath )
if response == 0 then
return true
end
return false
end
显然,这可能不适用于其他操作系统。但对于Windows用户来说,这可以是一个解决方案:)
答案 6 :(得分:1)
这是一个检查文件夹是否存在而没有任何外部库依赖项的简单方法:)
function directory_exists(path)
local f = io.popen("cd " .. path)
local ff = f:read("*all")
if (ff:find("ItemNotFoundException")) then
return false
else
return true
end
end
print(directory_exists("C:\\Users"))
print(directory_exists("C:\\ThisFolder\\IsNotHere"))
如果您将上述内容复制并粘贴到Lua中,您应该看到
false
true
祝你好运:)
答案 7 :(得分:1)
我使用这些(但实际上我检查错误):
require("lfs")
-- no function checks for errors.
-- you should check for them
function isFile(name)
if type(name)~="string" then return false end
if not isDir(name) then
return os.rename(name,name) and true or false
-- note that the short evaluation is to
-- return false instead of a possible nil
end
return false
end
function isFileOrDir(name)
if type(name)~="string" then return false end
return os.rename(name, name) and true or false
end
function isDir(name)
if type(name)~="string" then return false end
local cd = lfs.currentdir()
local is = lfs.chdir(name) and true or false
lfs.chdir(cd)
return is
end
os.rename(name1,name2)将name1重命名为name2。使用相同的名称,不应该更改任何内容(除了有一个badass错误)。如果一切顺利,它返回true,否则返回nil和errormessage。你说你不想使用lfs。如果你不想在不试图打开文件的情况下区分文件和directorys(这有点慢但是没问题)。
所以没有LuaFileSystem
-- no require("lfs")
function exists(name)
if type(name)~="string" then return false end
return os.rename(name,name) and true or false
end
function isFile(name)
if type(name)~="string" then return false end
if not exists(name) then return false end
local f = io.open(name)
if f then
f:close()
return true
end
return false
end
function isDir(name)
return (exists(name) and not isFile(name))
end
它看起来更短,但需要更长时间...... 同样打开文件是有风险的,因为你应该使用lfs。 如果您不关心性能(和错误处理-.-),您可以使用它。
玩得开心!
答案 8 :(得分:1)
我在linux中这样做的首选方法是
if os.execute '[ -e "/home" ]' then
io.write "it exists"
if os.execute '[ -d "/home" ]' then
io.write " and is a directory"
end
io.write "\n"
end
或者,将其放入函数中:
function is_dir(path)
return os.execute(('[ -d "%s" ]'):format(path))
end -- note that this implementation will return some more values
答案 9 :(得分:0)
对于Linux用户:
function dir_exists( path )
if type( path ) ~= 'string' then
error('input error')
return false
end
local response = os.execute( 'cd ' .. path )
if response == nil then
return false
end
return response
end