Как загрузить все файлы из каталога? - PullRequest
2 голосов
/ 02 апреля 2009

Как видно из названия; как загрузить каждый файл в каталоге? Я интересуюсь как c ++, так и lua.

Edit: Для окон я был бы рад за некоторый реальный рабочий код и особенно для lua. Я могу сделать с boost :: filesystem для c ++.

Ответы [ 4 ]

8 голосов
/ 03 апреля 2009

Для Lua вам нужен модуль Lua Filesystem .

Как заметил Ник, доступ к самой файловой системе (в отличие от отдельных файлов) выходит за рамки стандартов C и C ++. Поскольку сам Lua (за исключением динамического загрузчика, используемого для реализации require () для модулей C) написан на стандартном языке C, в базовом языке отсутствуют многие функции файловой системы.

Однако ядро ​​Lua легко расширить, поскольку (почти) любая платформа с файловой системой также поддерживает библиотеки DLL или общие библиотеки. Файловая система Lua - это переносимая библиотека, в которую добавлена ​​поддержка итерации каталогов, обнаружения атрибутов файлов и т. П.

С lfs эмулирование некоторых возможностей DIR в Lua по сути так же просто, как:

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 для Windows , то у вас уже установлена ​​программа lfs, и приведенный выше пример будет работать из коробки.

Редактировать: Кстати, решение Lua также может быть разумным решением C или C ++. Ядро Lua совсем не велико, предоставляет динамический язык для сбора мусора и легко взаимодействует с C как в качестве хост-приложения, так и в качестве модуля расширения. Чтобы использовать lfs из приложения C, вы должны связать с Lua DLL, инициализировать состояние Lua и получить состояние для выполнения require"lfs" либо через luaL_dostring(), либо с помощью C API для получения функции require() из в глобальной таблице нажмите строку "lfs" и вызовите функцию Lua с чем-то вроде lua_pcall(L,1,1,0), в результате чего таблица lfs окажется на вершине стека Lua.

Этот подход, вероятно, наиболее эффективен, если вам уже нужен встроенный язык сценариев, и Lua отвечает вашим требованиям.

4 голосов
/ 02 апреля 2009

Для решения C ++ взгляните на библиотеку Boost.Filesystem .

2 голосов
/ 02 апреля 2009

Список файлов в каталоге определяется платформой, поэтому вам придется использовать зависимую от платформы библиотеку. Это верно для c ++ и Lua (который реализует только всю функциональность).

1 голос
/ 07 марта 2012
require "lfs"

function loadall(dir)
  for file in lfs.dir(dir) do
    if string.find(file, ".lua$") then
      dofile(dir .. "/".. file)     
    end
  end
end
...