2009-04-02 3 views
2

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

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

+0

что вы подразумеваете под «нагрузкой»? – bayda

+0

загрузить, запустить, найти. В частности, с помощью lua используйте команду «dofile (s)» для всего, что находится в каталоге – Jonas

ответ

8

Для Lua требуется модуль Lua Filesystem.

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

Тем не менее, легко расширить ядро ​​Lua, так как практически любая платформа, в которой есть файловая система, также поддерживает библиотеки DLL или разделяемые библиотеки. Lua File system - это портативная библиотека, которая добавляет поддержку итерации каталогов, обнаружения атрибутов файлов и т. П.

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

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

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

2

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

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 
+0

. Вместо 'require' вы должны использовать' dofile': вы загружаете файлы, а не модули. – lhf

+0

Спасибо @lhf, я исправил код. –