用luajit编写一个读取文件夹中的文件,正确代码,不要用lfs
时间: 2024-05-15 14:16:50 浏览: 172
读取文件的代码
因为Lua本身并没有提供读取文件夹中文件的函数,因此需要使用操作系统提供的接口来实现。以下是一个使用LuaJIT调用操作系统接口读取文件夹中文件的示例代码:
```lua
local ffi = require("ffi")
local C = ffi.C
-- 定义需要使用的Windows API函数
ffi.cdef[[
typedef void* HANDLE;
typedef struct {
unsigned long dwLowDateTime;
unsigned long dwHighDateTime;
} FILETIME;
typedef struct {
unsigned long dwFileAttributes;
FILETIME ftCreationTime;
FILETIME ftLastAccessTime;
FILETIME ftLastWriteTime;
unsigned long nFileSizeHigh;
unsigned long nFileSizeLow;
unsigned long dwReserved0;
unsigned long dwReserved1;
char cFileName[260];
char cAlternateFileName[14];
} WIN32_FIND_DATAA;
HANDLE FindFirstFileA(const char* lpFileName, WIN32_FIND_DATAA* lpFindFileData);
int FindNextFileA(HANDLE hFindFile, WIN32_FIND_DATAA* lpFindFileData);
int FindClose(HANDLE hFindFile);
]]
-- 定义函数读取文件夹中的文件名
function listFiles(directory)
local path = directory .. "\\*.*"
local files = {}
local data = ffi.new("WIN32_FIND_DATAA")
local handle = C.FindFirstFileA(path, data)
if handle ~= ffi.cast("HANDLE", -1) then
repeat
local filename = ffi.string(data.cFileName)
if filename ~= "." and filename ~= ".." then
table.insert(files, filename)
end
until C.FindNextFileA(handle, data) == 0
C.FindClose(handle)
end
return files
end
-- 使用示例
local files = listFiles("C:\\Windows")
for i, filename in ipairs(files) do
print(filename)
end
```
以上代码定义了一个`listFiles`函数,传入文件夹路径后会返回一个包含所有文件名的表格。该函数使用了Windows API中的`FindFirstFileA`和`FindNextFileA`函数来遍历文件夹中的所有文件,忽略了`.`和`..`两个文件名。使用示例中遍历了Windows系统文件夹,并输出了所有文件名。
阅读全文