Как загрузить все файлы из каталога?

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

Изменить: для окон я был бы рад получить реальный рабочий код, особенно для lua. Я могу использовать boost::filesystem для С++.


person Jonas    schedule 02.04.2009    source источник
comment
загрузить, запустить, найти. В частности, с lua используйте команду dofile(s) для всего в каталоге.   -  person Jonas    schedule 02.04.2009


Ответы (4)


Для 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 удовлетворяет вашим требованиям.

person RBerteig    schedule 02.04.2009

Для решения C++ посмотрите Boost.Filesystem библиотека.

person Reunanen    schedule 02.04.2009

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

person Nick Van Brunt    schedule 02.04.2009

person    schedule
comment
Вы должны использовать dofile вместо require здесь: вы загружаете файлы, а не модули. - person lhf; 07.03.2012