Проверить, существует ли каталог в lua? - PullRequest
12 голосов
/ 27 августа 2009

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

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

os.path.isdir(path)

Ответы [ 10 ]

12 голосов
/ 27 августа 2009

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

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

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

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

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

11 голосов
/ 22 октября 2016

Это способ, который работает как в 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
9 голосов
/ 28 августа 2009

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

require 'posix'
function isdir(fn)
    return (posix.stat(fn, "type") == 'directory')
end
5 голосов
/ 27 августа 2009

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

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

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

os.rename(oldname, newname)

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

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

4 голосов
/ 04 мая 2016

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

Тогда в Lua сделать:

require 'paths'

if paths.dirp('your_desired_directory') then
    print 'it exists'
else
    print 'it does not exist'
end
2 голосов
/ 22 октября 2013

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

1 голос
/ 10 октября 2016

Мой предпочтительный способ сделать это в 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
1 голос
/ 08 февраля 2014

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

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) переименует name1 в name2. Используйте то же имя, и ничто не должно измениться (за исключением ошибки). Если все работает хорошо, он возвращает true, иначе он возвращает nil и сообщение об ошибке. Вы сказали, что не хотите использовать 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. Если вас не волнует производительность (и обработка ошибок -.-), вы можете просто использовать ее.

Веселого программирования!

1 голос
/ 04 ноября 2012

вот простой способ проверить, существует ли папка без каких-либо внешних зависимостей библиотеки :)

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

удачи :) 1007 *

0 голосов
/ 25 февраля 2016

Для пользователей 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...