2

タイトルが言うように; ディレクトリ内のすべてのファイルをロードするにはどうすればよいですか? 私は c++ と lua の両方に興味があります。

編集:Windowsの場合、実際に機能するコード、特にluaがあればうれしいです。C ++のboost::filesystemでできます。

4

4 に答える 4

8

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 がその要件を満たしている場合、このアプローチはおそらく最も理にかなっています。

于 2009-04-02T20:27:38.277 に答える
4

C++ ソリューションについては、Boost.Filesystemライブラリをご覧ください。

于 2009-04-02T15:43:14.357 に答える
2

ディレクトリ内のファイルのリストはプラットフォームによって定義されるため、プラットフォームに依存するライブラリを使用する必要があります。これは、c++ と Lua (ANSI c 機能のみを実装する) に当てはまります。

于 2009-04-02T15:40:57.983 に答える
1
require "lfs"

function loadall(dir)
  for file in lfs.dir(dir) do
    if string.find(file, ".lua$") then
      dofile(dir .. "/".. file)     
    end
  end
end
于 2012-03-07T12:24:24.493 に答える