Как проверить, существует ли каталог в lua, желательно без использования модуля LuaFileSystem, если это возможно?
Попытка сделать что-то вроде этой строки python:
os.path.isdir(path)
Как проверить, существует ли каталог в lua, желательно без использования модуля LuaFileSystem, если это возможно?
Попытка сделать что-то вроде этой строки python:
os.path.isdir(path)
Проблема заключается в том, что дистрибутив Lua (почти) содержит только те функции, которые указаны в стандарте C. Стандарт C не делает никаких презумпций о том, что на самом деле существует файловая система любого конкретного вида (или даже операционная система для это важно), поэтому модули os
и io
не предоставляют информацию о доступе, недоступную из стандартной библиотеки C.
Если вы пытались кодировать чистый стандарт C, у вас была бы такая же проблема.
Есть вероятность, что вы можете узнать, существует ли папка неявно из попытки ее использования. Если вы ожидаете, что он будет существовать и будет доступен для записи, тогда создайте там временный файл, и если это удастся, папка существует. Если это не удается, вы, возможно, не сможете отличить несуществующую папку от недостаточных разрешений.
Безусловно, самый легкий ответ на получение конкретного ответа будет тонким связыванием только с теми вызовами функций, специфичными для ОС, которые предоставляют необходимую вам информацию. Если вы можете принять lua alien, тогда вам может понравиться привязка в другом чистом Lua.
Проще, но немного тяжелее, это принять Lua File System. Он предоставляет портативный модуль, который поддерживает большинство вещей, которые, возможно, захотят узнать о файлах и файловой системе.
Если вам особенно интересно избегать библиотеки LFS, Lua Posix library имеет интерфейс для stat().
require 'posix'
function isdir(fn)
return (posix.stat(fn, "type") == 'directory')
end
Это способ, который работает как для Unix, так и для Windows без каких-либо внешних зависимостей:
--- Check if a file or directory exists in this path
function exists(file)
local ok, err, code = os.rename(file, file)
if not ok then
if code == 13 then
-- Permission denied, but it exists
return true
end
end
return ok, err
end
--- Check if a directory exists in this path
function isdir(path)
-- "/" works on both Unix and Windows
return exists(path.."/")
end
Ну, в справочном руководстве 5.1 нет ничего в таблице os, но если вы используете Nixstaller, вы получите os.fileexists
за то, что вы объяснили.
Если вы можете позволить себе немного поиграть, или если вы знаете, в какой ОС вы будете работать, вы можете уйти со стандартной os-библиотекой os.execute
с помощью какого-то системного вызова, который определит, существует ли файл.
Даже лучше os.execute может быть os.rename:
os.rename(oldname, newname)
Переименовывает файл с именем
oldname
вnewname
. Если эта функция не работает, она возвращается nil плюс строка, описывающая ошибка.
Вы можете попробовать устаревать старое имя и новое имя - возможно, у вас нет прав на запись, поэтому он может выйти из строя, потому что вы не можете писать, даже если вы можете читать. В этом случае вам придется проанализировать возвращаемую строку ошибки и вывести, можете ли вы писать, или вам нужно просто попробовать выполнить вашу функцию, которая нуждается в существующем файле, и обернуть ее в pcall
.
Вы также можете использовать пакет "paths". Здесь ссылка на пакет
Затем в Lua do:
require 'paths'
if paths.dirp('your_desired_directory') then
print 'it exists'
else
print 'it does not exist'
end
Это проверено на платформе Windows. На самом деле это довольно просто:
local function directory_exists( sPath )
if type( sPath ) ~= "string" then return false end
local response = os.execute( "cd " .. sPath )
if response == 0 then
return true
end
return false
end
Очевидно, что это может не работать на других ОС. Но для пользователей Windows это может быть решением:)
Я использую эти (но я действительно проверяю на ошибку):
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
Он выглядит короче, но занимает больше времени... Также открыть файл является рискованным, из-за этого вы должны использовать lfs. Если вам не нужна производительность (и обработка ошибок -.-), вы можете просто использовать ее.
Получайте удовольствие от кодирования!
вот простой способ проверить, существует ли папка БЕЗ КАКИХ-ЛИБО ВНЕШНИХ БИБЛИОТЕЧНЫХ ЗАВИСИМОСТИ:)
function directory_exists(path)
local f = io.popen("cd " .. path)
local ff = f:read("*all")
if (ff:find("ItemNotFoundException")) then
return false
else
return true
end
end
print(directory_exists("C:\\Users"))
print(directory_exists("C:\\ThisFolder\\IsNotHere"))
Если вы скопируете и вставьте выше в Lua, вы должны увидеть
false
true
удачи:)
Для пользователей Linux:
function dir_exists( path )
if type( path ) ~= 'string' then
error('input error')
return false
end
local response = os.execute( 'cd ' .. path )
if response == nil then
return false
end
return response
end
Мой предпочтительный способ сделать это в linux
if os.execute '[ -e "/home" ]' then
io.write "it exists"
if os.execute '[ -d "/home" ]' then
io.write " and is a directory"
end
io.write "\n"
end
или, чтобы включить это в функцию:
function is_dir(path)
return os.execute(('[ -d "%s" ]'):format(path))
end -- note that this implementation will return some more values