Luaを使用してファイルが存在するかどうかを確認するにはどうすればよいですか?
15 に答える
試す
function file_exists(name)
local f=io.open(name,"r")
if f~=nil then io.close(f) return true else return false end
end
ただし、このコードは、ファイルを読み取り用に開くことができるかどうかのみをテストすることに注意してください。
プレーンな Lua を使用してできる最善の方法は、LHF に従って、ファイルを読み取り用に開くことができるかどうかを確認することです。ほとんどの場合、これで十分です。しかし、さらに必要な場合は、 Lua POSIX ライブラリをロードし、posix.stat(
path)
が non- を返すかどうかを確認してくださいnil
。
ここから自己引用します
私はこれらを使用します(ただし、実際にエラーをチェックします):
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
短く見えますが、時間がかかります...また、ファイルを開くのは危険です
楽しくコーディングしましょう!
Windows であるという答えは、ファイルとフォルダーのみをチェックし、追加のパッケージも必要としません。true
またはを返しますfalse
。
io.popen("if exist "..PathToFileOrFolder.." (echo 1)"):read'*l'=='1'
io.popen(...):read'*l' - コマンド プロンプトでコマンドを実行し、CMD stdout から結果を読み取ります
存在する場合- オブジェクトが存在するかどうかを確認する CMD コマンド
(echo 1) - コマンド プロンプトの stdout に 1 を出力します。
このようなことをしてみませんか?
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
return false
end
if exist("myfile") then
print("hi, file exists")
else
print("bye, file does not exist")
end
ライブラリ ソリューションの場合、 または のいずれかを使用できpaths
ますpath
。
の公式文書からpaths
:
paths.filep(パス)
パスが既存のファイルを参照しているかどうかを示すブール値を返します。
paths.dirp(パス)
パスが既存のディレクトリを参照しているかどうかを示すブール値を返します。
名前は少し奇妙ですがpaths.filep()
、パスが存在し、それがファイルであるかどうかを確認するために使用できます。paths.dirp()
存在するかどうか、およびディレクトリであるかどうかを確認するために使用します。とても便利。
path
よりも希望する場合は、 withをpaths
使用してパスの存在を確認し、同時にその値を取得できます。ピースからパスを構築する場合に便利です。path.exists()
assert()
prefix = 'some dir'
filename = assert(path.exist(path.join(prefix, 'data.csv')), 'data.csv does not exist!')
ブール値の結果を確認したいだけの場合は、 and を使用path.isdir()
しpath.isfile()
ます。その目的は名前からよく理解できます。
IsFile = function(path)
print(io.open(path or '','r')~=nil and 'File exists' or 'No file exists on this path: '..(path=='' and 'empty path entered!' or (path or 'arg "path" wasn\'t define to function call!')))
end
IsFile()
IsFile('')
IsFIle('C:/Users/testuser/testfile.txt')
あなたの方法をテストするのに良さそうです。:)