Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

Попробуйте

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

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

Ответ 2

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

Ответ 3

Я приведу себя из здесь

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

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) переименует имя1 в 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

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

Получайте удовольствие от кодирования!

Ответ 4

Если вы используете Premake и LUA версии 5.3.4:

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

Ответ 5

Для полноты: вы также можете просто испытать удачу с помощью path.exists(filename). Я не уверен, какие дистрибутивы Lua на самом деле имеют это пространство имен path (update: 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

Ответ 6

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

Ответ 7

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

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

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

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

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

Ответ 8

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

Затем в Lua do:

require 'paths'

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

Ответ 9

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

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

Lua 5.1:

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

Ответ 11

Для решения библиотеки вы можете использовать либо 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(). Их цели хорошо понятны из их имен.

Ответ 12

Как насчет того, чтобы сделать что-то подобное?

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

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

Выглядит хорошо для тестирования вашего пути.:)