web-dev-qa-db-ja.com

Luaでファイルが存在するかどうかを確認します

Luaを使用してファイルが存在するかどうかを確認するにはどうすればよいですか?

62
Yoni

試して

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

ただし、このコードは、ファイルを読み取り用に開くことができるかどうかのみをテストすることに注意してください。

101
lhf

プレーンなLuaを使用してできることは、LHFに従ってファイルを読み取り用に開くことができるかどうかを確認することです。ほとんどの場合、これで十分です。しかし、さらに必要な場合は、 Lua POSIXライブラリ をロードし、posix.stat(path)は非nilを返します。

7
Norman Ramsey

here から引用します

私はこれらを使用します(ただし、実際にエラーをチェックします):

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

短く見えますが、時間がかかります...また、ファイルを開くと危険です

コーディングを楽しんでください!

5
tDwtp

私が使う:

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

LUA 5.3.4を使用しています。

5
Jesse Chisholm

lfsを使用する場合は、lfs.attributes。エラーの場合、nilを返します。

require "lfs"

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

存在しないファイル以外の他のエラーに対してnilを返すことができますが、nilを返さない場合、ファイルは確実に存在します。

3
Romário

完全を期すために、path.exists(filename)を使って運を試すこともできます。どのLuaディストリビューションに実際にこのpath名前空間があるかわかりません(updatePenlight )少なくともトーチに含まれています:

_$ 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)は、そのソースが_torch/install/share/lua/5.1/pl/path.lua_にあり、次のように実装されていることを示します。

_--- 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

Windowsである回答では、ファイルとフォルダーのみがチェックされ、追加のパッケージは必要ありません。 trueまたはfalseを返します。

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

io.popen(...):read '* l'-コマンドプロンプトでコマンドを実行し、CMD stdoutから結果を読み取ります

存在する場合-オブジェクトが存在するかどうかを確認するCMDコマンド

(echo 1)-コマンドプロンプトの標準出力に1を出力

2
WalyKu

「paths」パッケージを使用することもできます。 ここ はパッケージへのリンクです

次に、Luaで:

require 'paths'

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

ライブラリソリューションの場合は、pathsまたはpathのいずれかを使用できます。

公式ドキュメント of pathsから:

path.filep(path)

パスが既存のファイルを参照しているかどうかを示すブール値を返します。

path.dirp(パス)

パスが既存のディレクトリを参照しているかどうかを示すブール値を返します。

名前は少し奇妙ですが、paths.filep()を使用して、パスが存在し、ファイルであるかどうかを確認できます。 paths.dirp()を使用して、それが存在し、それがディレクトリであるかどうかを確認します。とても便利。

pathよりもpathsを好む場合は、path.exists()assert()とともに使用して、パスの存在を確認し、同じ値を取得できます。時間。断片からパスを構築するときに役立ちます。

_prefix = 'some dir'

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

ブール結果を確認したいだけなら、path.isdir()path.isfile()を使用してください。彼らの目的は彼らの名前からよく理解されています。

0
cgsdfc

これに対するあなたの特定の目的がわからない場合、または希望する実装を念頭に置いている場合は必ずしも理想的ではありませんが、ファイルを開いてその存在を確認することができます。

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は、ファイルを開けなかった場合にnilを返します。副次的な注意事項として、これがassertと共に使用されて、指定されたファイルを開けない場合に役立つエラーメッセージを生成する理由です。例えば:

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

ファイルhello.txtは存在しません。stdin:1: hello.txt: No such file or directory

0
Personage

このようなことはどうですか?

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