Le problème est que le stock de Lua de distribution (presque) comprend seulement les caractéristiques qui sont spécifiées dans la norme C. C Standard ne fait pas de présomptions sur il y a effectivement un système de fichiers de toute sorte (ou même un système d'exploitation, par ailleurs), de sorte que le os et io modules de ne pas fournir l'accès à des informations non disponibles dans la bibliothèque standard C.
Si vous tentiez de code dans le plus pur standard C, vous auriez le même problème.
Il ya une chance que vous pouvez savoir si le dossier existe implicitement à partir d'une tentative de l'utiliser. Si vous vous attendez à exister et être accessible en écriture pour vous, puis de créer un fichier temporaire et si le réussit, le dossier existe. Si elle échoue, vous pourriez ne pas être en mesure de distinguer un dossier inexistant à partir des autorisations insuffisantes, bien sûr.
De loin le plus léger de poids, de répondre à l'obtention d'une réponse spécifique serait une fine reliure à ceux spécifiques aux systèmes d'exploitation les appels de fonction qui fournissent les informations dont vous avez besoin. Si vous pouvez accepter la lua étranger module, puis vous pouvez faire comme la liaison au contraire pur Lua.
Plus simple, mais un peu plus lourd, c'est accepter Lua Système de Fichiers. Il fournit un portable module qui prend en charge la plupart des choses que l'on peut vouloir savoir sur les fichiers et le système de fichiers.
C'est un moyen qui fonctionne sur Unix et Windows, sans dépendances externes:
--- Check if a file or directory exists in this pathfunction exists(file)local ok, err, code = os.rename(file, file)ifnot ok thenif code ==13then-- Permission denied, but it existsreturntrueendendreturn ok, err
end--- Check if a directory exists in this pathfunction isdir(path)-- "/" works on both Unix and Windowsreturn exists(path.."/")end
Bien, le 5.1 manuel de référence n'a rien à l'os de la table, mais si vous utilisez Nixstaller, vous obtenez os.fileexists pour précisément ce que vous avez expliqué.
Si vous pouvez vous permettre de bidouiller un peu, ou si vous savez quel système d'exploitation vous serez en cours d'exécution, vous pourriez vous en tirer avec le standard de l'os de la bibliothèque os.execute avec certains appels système qui permettra de déterminer si le fichier existe.
Même mieux que les os.exécuter peut-être de l'os.renommer:
os.rename(oldname, newname)
Renomme un fichier nommé oldname à newname.
Si cette fonction échoue, elle renvoie
nul, en plus d'une chaîne de caractères décrivant l'
erreur.
Vous pouvez essayer le réglage de oldname et newname le même-vous ne disposez pas des autorisations d'écriture, bien que, de sorte qu'il peut échouer parce que vous ne pouvez pas écrire, même si vous peut lire. Dans ce cas, vous devez analyser l'erreur renvoyée chaîne et d'en déduire si vous pourriez écrire, ou si vous voulez simplement essayer de l'exécution de votre fonction qui a besoin d'un fichier existant, et l'envelopper dans un pcall.
Évidemment, cela peut ne pas fonctionner sur d'autres systèmes d'exploitation. Mais pour les utilisateurs de windows, cela peut être une solution 🙂
Quand je l'ai testé sur linux et windows, response est nil indépendamment de l'existence de sPath? Il n'est généralement pas considéré comme une bonne pratique pour appeler un programme externe pour une tâche aussi simple que cela, parce que cela tend à créer autant de problèmes que d'en résoudre. Sur les Unix-like des Systèmes d'exploitation de la sPath argument devrait être cité (pas sûr à propos de Windows) et c'est difficile à faire correctement.
voici un moyen simple pour vérifier si un dossier existe SANS AUCUNE BIBLIOTHÈQUE EXTERNE DÉPENDANCES 🙂
function directory_exists(path)local f = io.popen("cd ".. path)local ff = f:read("*all")if(ff:find("ItemNotFoundException"))thenreturnfalseelsereturntrueendend
print(directory_exists("C:\\Users"))
print(directory_exists("C:\\ThisFolder\\IsNotHere"))
Si vous copiez et collez les éléments ci-dessus en Lua, vous devriez voir
falsetrue
bonne chance 🙂
Cette solution semble supposer que l'utilisateur est à l'aide de Powershell... Vérifier le code de retour de la commande cd serait probablement travailler. J'attendais les résultats pour être vrai pour le premier, false pour le second.
- Je utiliser ces (mais je l'ai fait pour vérifier l'erreur):
require("lfs")-- no function checks for errors.-- you should check for themfunction isFile(name)if type(name)~="string"thenreturnfalseendifnot isDir(name)thenreturn os.rename(name,name)andtrueorfalse-- note that the short evaluation is to-- return false instead of a possible nilendreturnfalseendfunction isFileOrDir(name)if type(name)~="string"thenreturnfalseendreturn os.rename(name, name)andtrueorfalseendfunction isDir(name)if type(name)~="string"thenreturnfalseendlocal cd = lfs.currentdir()local is = lfs.chdir(name)andtrueorfalse
lfs.chdir(cd)return is
end
os.renommer(nom1, nom2) renommer nom1 de nom2. Utiliser le même nom et que rien ne doit changer (sauf qu'il n'y est une monstrueuse erreur). Si tout a bien marché elle renvoie true, sinon elle renvoie nil et le errormessage. Vous avez dit que vous ne voulez pas utiliser l'eft. Si vous n'avez pas vous ne pouvez pas différencier les fichiers et répertoires sans essayer d'ouvrir le fichier (qui est un peu lent, mais ok).
Sans LuaFileSystem
-- no require("lfs")function exists(name)if type(name)~="string"thenreturnfalseendreturn os.rename(name,name)andtrueorfalseendfunction isFile(name)if type(name)~="string"thenreturnfalseendifnot exists(name)thenreturnfalseendlocal f = io.open(name)if f then
f:close()returntrueendreturnfalseendfunction isDir(name)return(exists(name)andnot isFile(name))end
Il semble plus courte, mais prend plus de temps...
Également ouvrir un fichier est-il pas risqué, à cause de qui vous devrait utilisation de l'eft.
Si vous n'avez pas de soins sur les performances (et errorhandling -.-) vous pouvez simplement l'utiliser.
M'amuser à coder!
io.open travaille également avec des répertoires. Vous devez essayer de le lire (f:read(1)) de plus. Merci! Ne savais pas que! Ne serait-ce pas aussi lever une erreur si le fichier est vide (si j'ajoute " f:lire(1)')? Et autant que je sache, 'f:read(0)' n'aide pas trop...
Le problème est que le stock de Lua de distribution (presque) comprend seulement les caractéristiques qui sont spécifiées dans la norme C. C Standard ne fait pas de présomptions sur il y a effectivement un système de fichiers de toute sorte (ou même un système d'exploitation, par ailleurs), de sorte que le
os
etio
modules de ne pas fournir l'accès à des informations non disponibles dans la bibliothèque standard C.Si vous tentiez de code dans le plus pur standard C, vous auriez le même problème.
Il ya une chance que vous pouvez savoir si le dossier existe implicitement à partir d'une tentative de l'utiliser. Si vous vous attendez à exister et être accessible en écriture pour vous, puis de créer un fichier temporaire et si le réussit, le dossier existe. Si elle échoue, vous pourriez ne pas être en mesure de distinguer un dossier inexistant à partir des autorisations insuffisantes, bien sûr.
De loin le plus léger de poids, de répondre à l'obtention d'une réponse spécifique serait une fine reliure à ceux spécifiques aux systèmes d'exploitation les appels de fonction qui fournissent les informations dont vous avez besoin. Si vous pouvez accepter la lua étranger module, puis vous pouvez faire comme la liaison au contraire pur Lua.
Plus simple, mais un peu plus lourd, c'est accepter Lua Système de Fichiers. Il fournit un portable module qui prend en charge la plupart des choses que l'on peut vouloir savoir sur les fichiers et le système de fichiers.
OriginalL'auteur RBerteig
C'est un moyen qui fonctionne sur Unix et Windows, sans dépendances externes:
os.rename
pour queOriginalL'auteur Hisham H M
Si vous êtes particulièrement intéressé en évitant l'EPA de la bibliothèque, le Lua bibliothèque Posix dispose d'une interface à stat().
OriginalL'auteur adrian
Bien, le 5.1 manuel de référence n'a rien à l'os de la table, mais si vous utilisez Nixstaller, vous obtenez
os.fileexists
pour précisément ce que vous avez expliqué.Si vous pouvez vous permettre de bidouiller un peu, ou si vous savez quel système d'exploitation vous serez en cours d'exécution, vous pourriez vous en tirer avec le standard de l'os de la bibliothèque
os.execute
avec certains appels système qui permettra de déterminer si le fichier existe.Même mieux que les os.exécuter peut-être de l'os.renommer:
Vous pouvez essayer le réglage de oldname et newname le même-vous ne disposez pas des autorisations d'écriture, bien que, de sorte qu'il peut échouer parce que vous ne pouvez pas écrire, même si vous peut lire. Dans ce cas, vous devez analyser l'erreur renvoyée chaîne et d'en déduire si vous pourriez écrire, ou si vous voulez simplement essayer de l'exécution de votre fonction qui a besoin d'un fichier existant, et l'envelopper dans un
pcall
.OriginalL'auteur Mark Rushakoff
Vous pouvez également utiliser les chemins d'accès". Ici's le lien vers le package
Puis en Lua faire:
OriginalL'auteur Amir
C'est testé pour la plateforme windows. Il est assez facile en fait:
Évidemment, cela peut ne pas fonctionner sur d'autres systèmes d'exploitation. Mais pour les utilisateurs de windows, cela peut être une solution 🙂
response
estnil
indépendamment de l'existence desPath
?Il n'est généralement pas considéré comme une bonne pratique pour appeler un programme externe pour une tâche aussi simple que cela, parce que cela tend à créer autant de problèmes que d'en résoudre. Sur les Unix-like des Systèmes d'exploitation de la
sPath
argument devrait être cité (pas sûr à propos de Windows) et c'est difficile à faire correctement.OriginalL'auteur Engineer
voici un moyen simple pour vérifier si un dossier existe SANS AUCUNE BIBLIOTHÈQUE EXTERNE DÉPENDANCES 🙂
Si vous copiez et collez les éléments ci-dessus en Lua, vous devriez voir
bonne chance 🙂
J'attendais les résultats pour être vrai pour le premier, false pour le second.
OriginalL'auteur user1709076
- Je utiliser ces (mais je l'ai fait pour vérifier l'erreur):
os.renommer(nom1, nom2) renommer nom1 de nom2. Utiliser le même nom et que rien ne doit changer (sauf qu'il n'y est une monstrueuse erreur). Si tout a bien marché elle renvoie true, sinon elle renvoie nil et le errormessage. Vous avez dit que vous ne voulez pas utiliser l'eft. Si vous n'avez pas vous ne pouvez pas différencier les fichiers et répertoires sans essayer d'ouvrir le fichier (qui est un peu lent, mais ok).
Sans LuaFileSystem
Il semble plus courte, mais prend plus de temps...
Également ouvrir un fichier est-il pas risqué, à cause de qui vous devrait utilisation de l'eft.
Si vous n'avez pas de soins sur les performances (et errorhandling -.-) vous pouvez simplement l'utiliser.
M'amuser à coder!
io.open
travaille également avec des répertoires. Vous devez essayer de le lire (f:read(1)
) de plus.Merci! Ne savais pas que! Ne serait-ce pas aussi lever une erreur si le fichier est vide (si j'ajoute " f:lire(1)')? Et autant que je sache, 'f:read(0)' n'aide pas trop...
OriginalL'auteur tDwtp
Ma façon préférée de le faire sous linux est
ou, mettre cela dans une fonction:
OriginalL'auteur DarkWiiPlayer
Pour les utilisateurs de Linux:
OriginalL'auteur Franken