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

Если у меня есть этот код

local f = io.open("../web/", "r")
print(io.type(f))

-- output: file

как я могу знать если f точки к каталогу?

5
задан Peter Mortensen 27 May 2010 в 01:16
поделиться

4 ответа

В библиотеках 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
5
ответ дан 18 December 2019 в 06:02
поделиться

если вы сделаете

local x,err=f:read(1)

, тогда вы получите «Это каталог» в err .

5
ответ дан 18 December 2019 в 06:02
поделиться

ANSI C не определяет никакого способа получения информации о каталоге, поэтому ванильный Lua не может сообщить вам эту информацию (поскольку Lua стремится к 100% переносимости). Однако вы можете использовать внешнюю библиотеку, такую как LuaFileSystem, для идентификации каталогов.

Progamming in Lua даже прямо говорит об отсутствии функциональности каталогов:

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

В этом примере мы покажем вам, как самостоятельно написать функцию dir на языке C.

9
ответ дан 18 December 2019 в 06:02
поделиться

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

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 он работает нормально.

6
ответ дан 18 December 2019 в 06:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: