it-swarm-ru.tech

Проверьте, существует ли файл с Lua

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

61
Yoni

Пытаться

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

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

99
lhf

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

7
Norman Ramsey

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

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

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

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

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

5
tDwtp

Я использую:

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

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

4
Jesse Chisholm

Если вы хотите использовать 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
Romário

Ради полноты: вы также можете просто попытать счастья с path.exists(filename). Я не уверен, какие дистрибутивы Lua на самом деле имеют это пространство имен path (: Penlight ), но по крайней мере оно включено в Факеле:

$ 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
3
bluenote10

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

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

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

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

(echo 1) - выводит 1 в стандартный вывод командной строки

2
WalyKu

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

Затем в Lua сделать:

require 'paths'

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

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

Из официальный документpaths:

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
cgsdfc

Не обязательно самый идеальный, так как я не знаю вашей конкретной цели для этого или если вы имеете в виду желаемую реализацию, но вы можете просто открыть файл, чтобы проверить его существование.

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.

0
Personage

Lua 5.1:

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