Pit Lib 資料夾資訊

lua-users home
wiki

以下是 PetersStdLib 的一部份資料夾遍歷函式。請注意它們目前僅適用於 Win32,並且需要末尾的小型 C 函式才能工作。(不過應該可以輕鬆為您喜歡的任何其他作業系統提供函式)使用 posix 函式庫執行這項動作或許也不錯。(另請參閱:StandardLibraryProposal

資料夾程式碼

-- dofile for every lua file in folder
function dodirectory(directory, mask)
  mask = mask or "*.lua" -- default extension is lua
  local list = External_ReadDirectory(directory.."\\"..mask)
  local i=1
  sort(list)
  while list[i] do
    dofile(directory.."\\"..list[i])
    i=i+1
  end
end

-- user function for every file in (current) folder
-- example: fordirectory(print) or fordirectory(dofile, "*.lua") 
--          or fordirectory(execute, "*.bat", "C:\\")
function fordirectory(f, mask, directory)
  local prefix = "" -- default folder is current folder
  if directory then prefix = directory.."\\" end
  mask = mask or "*.*"  -- default mask is "all files with extension"
  local list = External_ReadDirectory(prefix..mask)
  local i=1
  sort(list)
  while list[i] do
    f(prefix..list[i])
    i=i+1
  end
end

以下為 Dirk Ringes 實作的讀取資料夾函式,我將此函式用於 stdlib 中的這些函式

#include "io.h"

static int External_ReadDirectory(lua_State* pLuaState)
{
  const char *mask;
  struct _finddata_t c_file;
  long hFile;
  int i = 1;

  if(lua_isstring(pLuaState, 1))
    mask = lua_tostring(pLuaState, 1);
  else
    mask = "*.*";

  lua_newtable(pLuaState);

  hFile = _findfirst(mask, &c_file);
  if(hFile != -1)
  {
    lua_pushstring(pLuaState, c_file.name);
    lua_rawseti(pLuaState, -2, i);
 
    while(_findnext(hFile, &c_file) == 0)
    {
      i ++;

      lua_pushstring(pLuaState, c_file.name);
      lua_rawseti(pLuaState, -2, i);
    }

    _findclose(hFile);
  }

  return 1;
}

另請參閱 LuaRecipes,取得更多有關透過 Lua 存取檔案/資料夾清單的詳細資訊。


最新變更 · 喜好設定
編輯 · 歷史記錄
最後編輯時間為 2007 年 4 月 8 日上午 2:36 GMT (diff)