Используя Lua, проверьте, является ли файл каталогом - PullRequest
4 голосов
/ 14 мая 2010

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

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

-- output: file

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

Ответы [ 7 ]

9 голосов
/ 14 мая 2010

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

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

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

Этот пример переходит к тому, чтобы показать вам, как самостоятельно написать функцию dir в C.

6 голосов
/ 15 июля 2010

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

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

5 голосов
/ 14 мая 2010

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

local x,err=f:read(1)

тогда вы получите "Is a directory" в err.

5 голосов
/ 14 мая 2010

Библиотеки Lua по умолчанию не могут это определить.

Однако вы можете использовать стороннюю библиотеку LuaFileSystem для получения доступа к более сложным взаимодействиям файловой системы; это также кроссплатформенный.

2 голосов
/ 13 июля 2016

Как минимум для UNIX:

if os.execute("cd '" .. f .. "'")
then print("Is a dir")
else print("Not a dir")
end

:)

0 голосов
/ 16 апреля 2015

Сначала проверяется, можно ли прочитать путь (который также равен nil для пустых файлов), а затем дополнительно проверяется, что размер не равен 0.

function is_dir(path)
    f = io.open(path)
    return not f:read(0) and f:seek("end") ~= 0
end
0 голосов
/ 31 октября 2012
function fs.isDir ( file )
if file == nil then return true end
if fs.exists(file) then
    os.execute("dir \""..userPath..file.."\" >> "..userPath.."\\Temp\\$temp")
    file = io.open(userPath.."\\Temp\\$temp","r")
    result = false
    for line in file:lines() do
        if string.find(line, "<DIR>") ~= nil then
            result = true
            break
        end
    end
    file:close()
    fs.delete("\\Temp\\$temp")
    if not (result == true or result == false) then
        return "Error"
    else
        return result
    end
else
    return false
end
end

Это некоторый код, который я извлек из библиотеки, которую нашел ранее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...