检查Lua是否存在文件


72

如何使用Lua检查文件是否存在?



2
@tonio-我想更多的是lua.org/pil/21.2.html
L先生

2
@Liutauras甚至接近真实答案。我只是对此进行了快速检查
tonio

1
嗨,Thx快速响应。我正在做:assert(io.input(fileName),“错误打开文件”)但是当我提供一个虚拟文件名时,我没有收到错误消息:“错误打开文件”。我得到的消息是:“'input'的错误参数#1(/pfrm2.0/share/lua/5.1/db/fake.dbdl:没有这样的文件或目录)”有什么想法吗?
Yoni

1
Yoni,我了解您刚刚加入SO。欢迎。没什么好说的。1)不要用新问题回答自己的问题。2)尝试四处搜索(Google是您的朋友)以获取更多信息,仅当您完全陷入困境时才在此处询问。我相信这将使您成为更好的开发人员。
L先生

Answers:


109

尝试

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
注意:如果文件是目录,则此方法返回false
QuidamAzerty



5

我会在这里引用自己

我使用这些(但实际上检查错误):

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和错误消息。如果您不想使用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

它看起来更短,但是需要更长的时间...另外打开文件很有风险

祝您编码愉快!


1
如何处理来自os.rename的有关重命名只读文件的错误?
亨里克·埃兰森

仅从lua打开文件有什么风险?
卡普里

@carpii如果尝试打开锁定的文件并从中读取文件,则可能会导致错误(您仍然想知道其是否为文件)。目录也是如此(如果主机上支持目录锁)。
tDwtp

@HenrikErlandsson是什么意思?对于“ badass error”,我并不是说可以通过代码修复。但是,AFAIK可以使用pcall捕获它们。处理可能很复杂,并且可能返回错误的错误消息。
tDwtp 2015年

3

为了完整起见:您也可以尝试通过碰碰运气path.exists(filename)。我不确定哪个Lua发行版实际上具有此path名称空间(updatePenlight),但至少它包含在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

1
那将是Penlight,并且它在后台使用LuaFileSystem
siffiejoe 2015年

3

如果您愿意使用lfs,可以使用lfs.attributesnil如果发生错误,它将返回:

require "lfs"

if lfs.attributes("non-existing-file") then
    print("File exists")
else
    print("Could not get attributes")
end

尽管它可以nil为不存在的文件以外的其他错误返回nil,但如果不返回,则该文件肯定存在。


3

Windows的答案仅检查文件和文件夹,并且不需要其他软件包。返回truefalse

io.popen("if exist "..PathToFileOrFolder.." (echo 1)"):read'*l'=='1'

io.popen(...):read'* l'-在命令提示符下执行命令,并从CMD stdout读取结果

如果存在-使用CMD命令检查对象是否存在

(echo 1) -在命令提示符的标准输出上打印1


这将打开一个简短可见的控制台窗口,所以我建议不要这样做。
ZzZombo

2

Windows的答案仅检查文件和文件夹,并且不需要其他程序包。它返回true或false。


1

您也可以使用“路径”包。是包的链接

然后在Lua中执行以下操作:

require 'paths'

if paths.filep('your_desired_file_path') then
    print 'it exists'
else
    print 'it does not exist'
end

1

Lua 5.1:

function file_exists(name)
   local f = io.open(name, "r")
   return f ~= nil and io.close(f)
end

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.opennil如果无法打开文件,则返回。作为附带说明,这就是为什么assert如果无法打开给定文件,通常将其用于产生有用的错误消息的原因。例如:

local file = assert(io.open("hello.txt"))

如果该文件hello.txt不存在,您将得到类似于的错误stdin:1: hello.txt: No such file or directory


0

对于库解决方案,可以使用pathspath

官方文件paths

path.filep(路径)

返回一个布尔值,指示路径是否引用现有文件。

path.dirp(路径)

返回一个布尔值,指示路径是否引用现有目录。

尽管名称有些奇怪,但是您可以肯定地使用它paths.filep()来检查路径是否存在以及它是否为文件。使用paths.dirp()来检查它是否存在,它是一个目录。很方便。

如果您更喜欢path而不是paths,则可以使用path.exists()withassert()来检查路径的存在,同时获取其值。当您从碎片中构建路径时很有用。

prefix = 'some dir'

filename = assert(path.exist(path.join(prefix, 'data.csv')), 'data.csv does not exist!')

如果只想检查布尔结果,请使用path.isdir()path.isfile()。他们的目的很容易理解。


0

如果使用LOVE,则可以使用函数love.filesystem.exists('NameOfFile'),用NameOfFile文件名代替。这将返回一个布尔值。


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
  return false
end

if exist("myfile") then
  print("hi, file exists")
else
  print("bye, file does not exist")
end

我得到'[[' is not recognized as an internal or external command, operable program or batch file.
sdbbs

它可以在我的Unix机器上运行。您正在使用什么操作系统?type [[应该说[[ is a shell keyword
Rakib Fiha

-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')

看起来很适合测试自己的方式。:)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.