Подтвердить что ты не робот

Проверить, существует ли каталог в lua?

Как проверить, существует ли каталог в lua, желательно без использования модуля LuaFileSystem, если это возможно?

Попытка сделать что-то вроде этой строки python:

os.path.isdir(path)
4b9b3361

Ответ 1

Проблема заключается в том, что дистрибутив Lua (почти) содержит только те функции, которые указаны в стандарте C. Стандарт C не делает никаких презумпций о том, что на самом деле существует файловая система любого конкретного вида (или даже операционная система для это важно), поэтому модули os и io не предоставляют информацию о доступе, недоступную из стандартной библиотеки C.

Если вы пытались кодировать чистый стандарт C, у вас была бы такая же проблема.

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

Безусловно, самый легкий ответ на получение конкретного ответа будет тонким связыванием только с теми вызовами функций, специфичными для ОС, которые предоставляют необходимую вам информацию. Если вы можете принять lua alien, тогда вам может понравиться привязка в другом чистом Lua.

Проще, но немного тяжелее, это принять Lua File System. Он предоставляет портативный модуль, который поддерживает большинство вещей, которые, возможно, захотят узнать о файлах и файловой системе.

Ответ 2

Если вам особенно интересно избегать библиотеки LFS, Lua Posix library имеет интерфейс для stat().

require 'posix'
function isdir(fn)
    return (posix.stat(fn, "type") == 'directory')
end

Ответ 3

Это способ, который работает как для 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

Ответ 4

Ну, в справочном руководстве 5.1 нет ничего в таблице os, но если вы используете Nixstaller, вы получите os.fileexists за то, что вы объяснили.

Если вы можете позволить себе немного поиграть, или если вы знаете, в какой ОС вы будете работать, вы можете уйти со стандартной os-библиотекой os.execute с помощью какого-то системного вызова, который определит, существует ли файл.

Даже лучше os.execute может быть os.rename:

os.rename(oldname, newname)

Переименовывает файл с именем oldname в newname. Если эта функция не работает, она возвращается nil плюс строка, описывающая ошибка.

Вы можете попробовать устаревать старое имя и новое имя - возможно, у вас нет прав на запись, поэтому он может выйти из строя, потому что вы не можете писать, даже если вы можете читать. В этом случае вам придется проанализировать возвращаемую строку ошибки и вывести, можете ли вы писать, или вам нужно просто попробовать выполнить вашу функцию, которая нуждается в существующем файле, и обернуть ее в pcall.

Ответ 5

Вы также можете использовать пакет "paths". Здесь ссылка на пакет

Затем в Lua do:

require 'paths'

if paths.dirp('your_desired_directory') then
    print 'it exists'
else
    print 'it does not exist'
end

Ответ 6

Это проверено на платформе 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 это может быть решением:)

Ответ 7

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

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. Если вам не нужна производительность (и обработка ошибок -.-), вы можете просто использовать ее.

Получайте удовольствие от кодирования!

Ответ 8

вот простой способ проверить, существует ли папка БЕЗ КАКИХ-ЛИБО ВНЕШНИХ БИБЛИОТЕЧНЫХ ЗАВИСИМОСТИ:)

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

удачи:)

Ответ 9

Для пользователей 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

Ответ 10

Мой предпочтительный способ сделать это в 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