如何使用Lua检查文件是否存在?
答案 0 :(得分:99)
尝试
function file_exists(name)
local f=io.open(name,"r")
if f~=nil then io.close(f) return true else return false end
end
但请注意,此代码仅测试是否可以打开文件进行阅读。
答案 1 :(得分:7)
使用普通Lua,您可以做的最好的事情是查看是否可以打开文件进行读取,如LHF所示。这几乎总是足够好。但是,如果您想要更多内容,请加载Lua POSIX library并检查posix.stat(
路径 )
是否返回非nil
。
答案 2 :(得分:5)
我将从here
引用自己我使用这些(但实际上是检查错误):
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,则无法在不尝试打开文件的情况下区分文件和目录(这有点慢但是没问题)。
所以没有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
它看起来更短,但需要更长时间...... 还打开一个文件是有风险的
玩得开心!
答案 3 :(得分:4)
我用:
if os.isfile(path) then
...
end
我正在使用LUA 5.3.4。
答案 4 :(得分:3)
为了完整起见:您也可以试试path.exists(filename)
的运气。我不确定哪个Lua发行版实际上有这个path
命名空间(更新:Penlight),但至少它包含在Torch中:
$ th
______ __ | Torch7
/_ __/__ ________/ / | Scientific computing for Lua.
/ / / _ \/ __/ __/ _ \ | Type ? for help
/_/ \___/_/ \__/_//_/ | https://github.com/torch
| http://torch.ch
th> path.exists(".gitignore")
.gitignore
th> path.exists("non-existing")
false
debug.getinfo(path.exists)
告诉我,其来源位于torch/install/share/lua/5.1/pl/path.lua
,其实施方式如下:
--- does a path exist?.
-- @string P A file path
-- @return the file path if it exists, nil otherwise
function path.exists(P)
assert_string(1,P)
return attrib(P,'mode') ~= nil and P
end
答案 5 :(得分:3)
如果您愿意使用lfs
,则可以使用lfs.attributes
。如果出现错误,它将返回nil
:
require "lfs"
if lfs.attributes("non-existing-file") then
print("File exists")
else
print("Could not get attributes")
end
虽然它可以返回nil
以查找非现有文件以外的其他错误,但如果它不返回nil
,则该文件肯定存在。
答案 6 :(得分:3)
一个答案是Windows,它仅检查文件和文件夹,并且不需要其他程序包。返回true或false。
答案 7 :(得分:2)
只有Windows的答案才会检查文件和文件夹,也不需要额外的包。它会返回true
或false
。
io.popen("if exist "..PathToFileOrFolder.." (echo 1)"):read'*l'=='1'
io.popen(...):read' * l' - 在命令提示符中执行命令并从CMD标准输出中读取结果
如果存在 - 用于检查对象是否存在的CMD命令
(echo 1) - 将1打印到命令提示符的stdout
答案 8 :(得分:1)
您还可以使用'路径'包。 Here指向软件包的链接
然后在Lua做:
require 'paths'
if paths.filep('your_desired_file_path') then
print 'it exists'
else
print 'it does not exist'
end
答案 9 :(得分:0)
不一定是最理想的选择,因为我不知道您的具体目的或是否有想要的实现,但是您可以简单地打开文件以检查其存在。
local function file_exists(filename)
local file = io.open(filename, "r")
if (file) then
-- Obviously close the file if it did successfully open.
file:close()
return true
end
return false
end
io.open
如果无法打开文件,则返回nil
。附带说明一下,这就是为什么如果无法打开给定文件,它通常与assert
一起使用会产生有用的错误消息的原因。例如:
local file = assert(io.open("hello.txt"))
如果文件hello.txt
不存在,您将得到类似于stdin:1: hello.txt: No such file or directory
的错误。
答案 10 :(得分:0)
Lua 5.1:
function file_exists(name)
local f = io.open(name, "r")
return f ~= nil and io.close(f)
end
答案 11 :(得分:0)
对于库解决方案,您可以使用paths
或path
。
来自paths
的{{3}}:
paths.filep(路径)
返回一个布尔值,指示路径是否指向现有文件。
paths.dirp(路径)
返回一个布尔值,指示路径是否指向现有目录。
尽管名称有些奇怪,但是您当然可以使用paths.filep()
来检查路径是否存在以及它是否是文件。使用paths.dirp()
检查它是否存在并且它是一个目录。非常方便。
如果您更喜欢path
而不是paths
,则可以将path.exists()
与assert()
一起使用来检查路径的存在,同时获取其值。当您从碎片中构建路径时很有用。
prefix = 'some dir'
filename = assert(path.exist(path.join(prefix, 'data.csv')), 'data.csv does not exist!')
如果只想检查布尔结果,请使用path.isdir()
和path.isfile()
。他们的名字很容易理解。
答案 12 :(得分:0)
如何做这样的事情?
function exist(file)
local isExist = io.popen(
'[[ -e '.. tostring(file) ..' ]] && { echo "true"; }')
local isIt = isExist:read("*a")
isExist:close()
isIt = string.gsub(isIt, '^%s*(.-)%s*$', '%1')
if isIt == "true" then
return true
end
end
if exist("myfile") then
print("hi, file exists")
else
print("bye, file does not exist")
end
答案 13 :(得分:0)
如果使用LOVE,则可以使用函数love.filesystem.exists('NameOfFile')
,用文件名替换NameOfFile
。
这将返回一个布尔值。
答案 14 :(得分:-6)
IsFile = function(path)
print(io.open(path or '','r')~=nil and 'File exists' or 'No file exists on this path: '..(path=='' and 'empty path entered!' or (path or 'arg "path" wasn\'t define to function call!')))
end
IsFile()
IsFile('')
IsFIle('C:/Users/testuser/testfile.txt')
看起来很适合测试你的方式。 :)