Проверьте, существует ли файл с Lua - PullRequest
61 голосов
/ 14 февраля 2011

Как я могу проверить, существует ли файл с использованием Lua?

Ответы [ 12 ]

99 голосов
/ 14 февраля 2011

Попробуйте

function file_exists(name)
   local f=io.open(name,"r")
   if f~=nil then io.close(f) return true else return false end
end

, но учтите, что этот код только проверяет, можно ли открыть файл для чтения.

7 голосов
/ 01 сентября 2012

Используя обычный Lua, лучшее, что вы можете сделать, - это посмотреть, можно ли открыть файл для чтения, согласно LHF.Это почти всегда достаточно хорошо.Но если вам нужно больше, загрузите Lua POSIX библиотеку и проверьте, возвращает ли posix.stat( путь ) не-nil.

5 голосов
/ 08 февраля 2014

Я процитирую себя от здесь

Я использую это (но я действительно проверяю на ошибку):

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. Используйте то же имя, и ничто не должно измениться (за исключением ошибки). Если все работает хорошо, он возвращает 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

выглядит короче, но занимает больше времени ... Также открыть файл рискованно

Веселого программирования!

4 голосов
/ 08 декабря 2017

Я использую:

if os.isfile(path) then
    ...
end

Я использую LUA 5.3.4.

3 голосов
/ 22 октября 2015

Если вы хотите использовать 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, файлбезусловно, существует.

3 голосов
/ 12 октября 2015

Ради полноты: вы также можете просто попытать счастья с 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
2 голосов
/ 23 августа 2017

Ответ, который Windows проверяет только для файлов и папок, а также не требует дополнительных пакетов.Возвращает true или false.

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

io.popen (...): read '* l' - выполняет команду в командной строкеи считывает результат из CMD stdout

, если существует - команда CMD, чтобы проверить, существует ли объект

(эхо 1) - печатает 1в стандартный поток командной строки

1 голос
/ 10 мая 2017

Вы также можете использовать пакет 'paths'. Здесь ссылка на пакет

Тогда в Lua сделать:

require 'paths'

if paths.filep('your_desired_file_path') then
    print 'it exists'
else
    print 'it does not exist'
end
0 голосов
/ 04 апреля 2019

Для решения библиотеки вы можете использовать либо paths или path.

Из официального документа из 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().Их цели хорошо понятны из их имен.

0 голосов
/ 20 февраля 2019

Lua 5.1:

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