Как я могу проверить, существует ли файл с использованием Lua?
Проверьте, существует ли файл с Lua
Ответ 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')
Выглядит хорошо для тестирования вашего пути.:)