Если у меня есть этот код
local f = io.open("../web/", "r")
print(io.type(f))
-- output: file
как я могу знать если f
точки к каталогу?
В библиотеках Lua по умолчанию нет способа определить это.
Однако, вы можете использовать стороннюю библиотеку LuaFileSystem, чтобы получить доступ к более продвинутым взаимодействиям с файловой системой; она также является кроссплатформенной.
LuaFileSystem предоставляет lfs.attributes, который вы можете использовать для запроса режима файла:
require "lfs"
function is_dir(path)
-- lfs.attributes will error on a filename ending in '/'
return path:sub(-1) == "/" or lfs.attributes(path, "mode") == "directory"
end
если вы сделаете
local x,err=f:read(1)
, тогда вы получите «Это каталог»
в err
.
ANSI C не определяет никакого способа получения информации о каталоге, поэтому ванильный Lua не может сообщить вам эту информацию (поскольку Lua стремится к 100% переносимости). Однако вы можете использовать внешнюю библиотеку, такую как LuaFileSystem, для идентификации каталогов.
Progamming in Lua даже прямо говорит об отсутствии функциональности каталогов:
В качестве более сложного примера, давайте напишем функцию, которая возвращает содержимое заданного каталога. Lua не предоставляет эту функцию в своих стандартных библиотеках, потому что ANSI C не имеет функций для этой работы.
В этом примере мы покажем вам, как самостоятельно написать функцию dir
на языке C.
Я нашел этот кусок кода в библиотеке, которую я использую:
function is_dir(path)
local f = io.open(path, "r")
local ok, err, code = f:read(1)
f:close()
return code == 21
end
Я не знаю, каким будет код в Windows, но в Linux/BSD/OSX он работает нормально.