2009-04-02 11 views
2

Wie der Titel sagt; Wie lade ich jede Datei in ein Verzeichnis? Ich bin an C++ und Lua interessiert.Wie lade ich alle Dateien aus einem Verzeichnis?

Edit: Für Windows würde ich mich freuen für einige echte Arbeits-Code und vor allem für Lua. Ich kann mit boost :: filesystem für C++ machen.

+0

was meinst du "laden"? – bayda

+0

laden, ausführen, suchen. Insbesondere mit lua benutze den "dofile (s)" Befehl für alles in einem dir – Jonas

Antwort

8

Für Lua, möchten Sie das Modul Lua Filesystem.

Wie von Nick beobachtet, liegt der Zugriff auf das Dateisystem selbst (im Gegensatz zu einzelnen Dateien) außerhalb des Geltungsbereichs der C- und C++ - Standards. Da Lua selbst (mit Ausnahme des dynamischen Loaders, der zum Implementieren von require() für C-Module verwendet wird) in Standard C geschrieben ist, fehlen der Kernsprache viele Dateisystemfunktionen.

Es ist jedoch einfach, den Lua-Kern zu erweitern, da (fast) jede Plattform, die über ein Dateisystem verfügt, auch DLLs oder gemeinsam genutzte Bibliotheken unterstützt. Das Lua-Dateisystem ist eine portable Bibliothek, die Unterstützung für Verzeichnisiteration, Dateiattributentdeckung und dergleichen bietet.

Mit LFS ist einfach im Wesentlichen als ein Teil der Fähigkeit von DIR in Lua emuliert als:

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 

Welche Ausgabe erzeugt, die wie folgt aussieht:

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:...> 

Wenn Sie Ihre Kopie von Lua kam aus Lua for Windows, dann haben Sie bereits lfs installiert, und das obige Beispiel wird out of the box funktionieren.

Edit: Im Übrigen könnte die Lua-Lösung auch eine sinnvolle C oder C++ Lösung sein. Der Lua-Core ist überhaupt nicht groß, bietet eine dynamische, müllsammelbare Sprache und ist leicht mit C als Host-Anwendung oder als Erweiterungsmodul zu interagieren. Um lfs aus einer C-Anwendung zu verwenden, würden Sie eine Verknüpfung mit der Lua-DLL herstellen, einen Lua-Status initialisieren und den Status zum Ausführen der require"lfs" entweder über luaL_dostring() oder mithilfe der C-API zum Abrufen der require()-Funktion aus der globalen Tabelle abrufen string "lfs", und rufen Sie die Lua-Funktion mit etwas wie lua_pcall(L,1,1,0), die die lfs Tabelle oben auf dem Lua-Stapel verlässt.

Dieser Ansatz ist wahrscheinlich am sinnvollsten, wenn Sie bereits eine eingebettete Skriptsprache benötigen und Lua Ihren Anforderungen entspricht.

2

Das Auflisten von Dateien in einem Verzeichnis wird von der Plattform definiert, sodass Sie eine plattformabhängige Bibliothek verwenden müssen. Dies gilt für C++ und Lua (das nur die ANSI-Funktionalität implementiert).

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

Sie sollten 'dofile' anstelle von' require' verwenden: Sie laden Dateien, keine Module. – lhf

+0

Danke @lhf, ich habe den Code behoben. –

Verwandte Themen