タイトルが言うように; ディレクトリ内のすべてのファイルをロードするにはどうすればよいですか? 私は c++ と lua の両方に興味があります。
編集:Windowsの場合、実際に機能するコード、特にluaがあればうれしいです。C ++のboost::filesystemでできます。
Lua の場合、モジュールLua Filesystemが必要です。
Nick が観察したように、(個々のファイルではなく) ファイル システム自体へのアクセスは、C および C++ 標準の範囲外です。Lua 自体は (C モジュールの require() を実装するために使用されるダイナミック ローダーを除いて) 標準 C で記述されているため、コア言語には多くのファイル システム機能がありません。
ただし、Lua コアを拡張するのは簡単です。これは、(ほぼ) ファイル システムを備えたすべてのプラットフォームが DLL や共有ライブラリもサポートしているためです。Lua ファイル システムは、ディレクトリの繰り返し、ファイル属性の検出などのサポートを追加するポータブル ライブラリです。
lfs を使用すると、Lua で DIR の機能の一部をエミュレートするのは、基本的に次のように簡単です。
require "lfs"
dot = arg[1] or "."
for name in lfs.dir(dot) do
local fqn = dot.."/"..name
local attr = lfs.attributes(fqn)
print(name, attr.mode, os.date("%Y-%m-%d %H:%M",attr.modification), attr.size)
end
次のような出力が生成されます。
E:...>t-lfs.lua
. directory 2009-04-02 13:23 0
.. directory 2009-04-02 13:18 0
foo.txt file 2009-02-23 01:56 0
t-lfs.lua file 2009-04-02 13:18 241
E:...>
Lua のコピーがLua for Windowsからのものである場合、既に lfs がインストールされており、上記のサンプルはすぐに使用できます。
編集:ちなみに、Lua ソリューションは賢明な C または C++ ソリューションである可能性もあります。Lua コアは決して大きくなく、動的なガベージ コレクション言語を提供し、ホスティング アプリケーションまたは拡張モジュールとして C から簡単に操作できます。C アプリケーションから lfs を使用するには、Lua DLL とリンクし、Lua 状態を初期化し、C APIrequire"lfs"
経由luaL_dostring()
または C API を使用しrequire()
てグローバル テーブルから関数を取得し、文字列をプッシュし"lfs"
て実行する状態を取得します。のようなもので Lua 関数を呼び出すと、Lua スタックの一番上にテーブルが残りますlua_pcall(L,1,1,0)
。lfs
既に組み込みスクリプト言語が必要で、Lua がその要件を満たしている場合、このアプローチはおそらく最も理にかなっています。
C++ ソリューションについては、Boost.Filesystemライブラリをご覧ください。
ディレクトリ内のファイルのリストはプラットフォームによって定義されるため、プラットフォームに依存するライブラリを使用する必要があります。これは、c++ と Lua (ANSI c 機能のみを実装する) に当てはまります。
require "lfs"
function loadall(dir)
for file in lfs.dir(dir) do
if string.find(file, ".lua$") then
dofile(dir .. "/".. file)
end
end
end