Comment puis-je vérifier si un fichier existe avec Lua?
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.
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
.
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!
J'utilise:
if os.isfile(path) then
...
end
J'utilise LUA 5.3.4.
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.
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
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
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
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.
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
.
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
Lua 5.1:
function file_exists(name)
local f = io.open(name, "r")
return f ~= nil and io.close(f)
end