web-dev-qa-db-fra.com

Vérifiez si un fichier existe avec Lua

Comment puis-je vérifier si un fichier existe avec Lua?

62
Yoni

Essayer

function file_exists(name)
   local f=io.open(name,"r")
   if f~=nil then io.close(f) return true else return false end
end

mais notez que ce code teste uniquement si le fichier peut être ouvert en lecture.

101
lhf

En utilisant du Lua simple, le mieux que vous puissiez faire est de voir si un fichier peut être ouvert en lecture, conformément à LHF. C'est presque toujours assez bon. Mais si vous en voulez plus, chargez la bibliothèque Lua POSIX et vérifiez si posix.stat( chemin ) renvoie non -nil.

7
Norman Ramsey

Je vais me citer de ici

J'utilise ces derniers (mais je vérifie réellement l'erreur):

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 (nom1, nom2) renommera nom1 en nom2. Utilisez le même nom et rien ne devrait changer (sauf en cas d'erreur badass). Si tout a bien fonctionné, il renvoie vrai, sinon il renvoie zéro et le message d'erreur. Si vous ne voulez pas utiliser lfs, vous ne pouvez pas différencier les fichiers et les répertoires sans essayer d'ouvrir le fichier (ce qui est un peu lent mais correct).

Donc sans 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

Il semble plus court, mais prend plus de temps ... L'ouverture d'un fichier est également risquée

Amusez-vous à coder!

5
tDwtp

J'utilise:

if os.isfile(path) then
    ...
end

J'utilise LUA 5.3.4.

5
Jesse Chisholm

Si vous souhaitez utiliser lfs, vous pouvez utiliser lfs.attributes. Il renverra nil en cas d'erreur:

require "lfs"

if lfs.attributes("non-existing-file") then
    print("File exists")
else
    print("Could not get attributes")
end

Bien qu'il puisse renvoyer nil pour d'autres erreurs autres qu'un fichier inexistant, s'il ne retourne pas nil, le fichier existe certainement.

3
Romário

Par souci d'exhaustivité: vous pouvez également tenter votre chance avec path.exists(filename). Je ne sais pas quelles distributions Lua ont réellement cet path espace de noms ( mise à jour : Penlight ), mais au moins, il est inclus dans Torch:

$ th

  ______             __   |  Torch7
 /_  __/__  ________/ /   |  Scientific computing for Lua.
  / / / _ \/ __/ __/ _ \  |  Type ? for help
 /_/  \___/_/  \__/_//_/  |  https://github.com/torch
                          |  http://torch.ch

th> path.exists(".gitignore")
.gitignore  

th> path.exists("non-existing")
false   

debug.getinfo(path.exists) me dit que sa source est dans torch/install/share/lua/5.1/pl/path.lua et qu'il est implémenté comme suit:

--- does a path exist?.
-- @string P A file path
-- @return the file path if it exists, nil otherwise
function path.exists(P)
    assert_string(1,P)
    return attrib(P,'mode') ~= nil and P
end
3
bluenote10

Une réponse qui est Windows vérifie uniquement les fichiers et les dossiers et ne nécessite également aucun package supplémentaire. Il renvoie true ou false.

io.popen("if exist "..PathToFileOrFolder.." (echo 1)"):read'*l'=='1'

io.popen (...): read '* l' - exécute une commande dans l'invite de commande et lit le résultat depuis la sortie standard du CMD

s'il existe - Commande CMD pour vérifier si un objet existe

(echo 1) - affiche 1 sur stdout de l'invite de commande

2
WalyKu

Vous pouvez également utiliser le package "chemins". Ici est le lien vers le package

Puis à Lua:

require 'paths'

if paths.filep('your_desired_file_path') then
    print 'it exists'
else
    print 'it does not exist'
end
1
Amir

Pour la solution de bibliothèque, vous pouvez utiliser paths ou path.

Du document officiel de paths:

paths.filep (chemin)

Renvoie un booléen indiquant si le chemin fait référence à un fichier existant.

paths.dirp (chemin)

Renvoie un booléen indiquant si le chemin fait référence à un répertoire existant.

Bien que les noms soient un peu étranges, vous pouvez certainement utiliser paths.filep() pour vérifier si un chemin existe et s'il s'agit d'un fichier. Utilisez paths.dirp() pour vérifier s'il existe et s'il s'agit d'un répertoire. Très pratique.

Si vous préférez path plutôt que paths, vous pouvez utiliser path.exists() avec assert() pour vérifier l'existence d'un chemin, en obtenant sa valeur au même temps. Utile lorsque vous construisez un chemin à partir de pièces.

prefix = 'some dir'

filename = assert(path.exist(path.join(prefix, 'data.csv')), 'data.csv does not exist!')

Si vous souhaitez simplement vérifier le résultat booléen, utilisez path.isdir() et path.isfile(). Leurs buts sont bien compris par leurs noms.

0
cgsdfc

Pas nécessairement le plus idéal car je ne connais pas votre objectif spécifique ou si vous avez une implémentation souhaitée en tête, mais vous pouvez simplement ouvrir le fichier pour vérifier son existence.

local function file_exists(filename)
    local file = io.open(filename, "r")
    if (file) then
        -- Obviously close the file if it did successfully open.
        file:close()
        return true
    end
    return false
end

io.open renvoie nil s'il ne parvient pas à ouvrir le fichier. En remarque, c'est pourquoi il est souvent utilisé avec assert pour produire un message d'erreur utile s'il ne parvient pas à ouvrir le fichier donné. Par exemple:

local file = assert(io.open("hello.txt"))

Si le fichier hello.txt n'existe pas, vous devriez obtenir une erreur similaire à stdin:1: hello.txt: No such file or directory.

0
Personage

Que diriez-vous de faire quelque chose comme ça?

function exist(file)
  local isExist = io.popen(
    '[[ -e '.. tostring(file) ..' ]] && { echo "true"; }')
  local isIt = isExist:read("*a")
  isExist:close()
  isIt = string.gsub(isIt, '^%s*(.-)%s*$', '%1')
  if isIt == "true" then
    return true
  end
end

if exist("myfile") then
  print("hi, file exists")
else
  print("bye, file does not exist")
end
0
Rakib Fiha

Lua 5.1:

function file_exists(name)
   local f = io.open(name, "r")
   return f ~= nil and io.close(f)
end
0
rubo77