Modules/FileSystem/translator/scanDirEx
This function loops through all translator filesystem entries that are captured by the wildcard and the directory specifier. The wildcard is glob-style and supports * and ? modifiers. The scan can be made recursive to enter every directory it finds, so that files and folders of a whole directory tree are captured. This function is used to process filesystem objects inside of directories without having to add the filenames into a configuration file. This greatly increases flexibility when processing files. This function is more flexible than scanDir as it triggers callbacks directly when either files or directories are found, making a distinction between files and directories very easy.
Syntax
bool translator:scanDirEx ( string dirPath, string wildcard, function dirCallback, function fileCallback, bool recursive )
Arguments
- dirPath: a path to the directory the scan shall take place or start in
- wildcard: glob-style wild-card for filename matching; every filename that matches the wild-card is returned
- dirCallback: the function callback that should trigger for every directory found (can be nil); the absolute path of the directory is passed to it
- fileCallback: the directory callback that should trigger for every file found (can be nil); the absolute path of the file is passed to it
- recursive: a boolean that specifies whether the whole directory tree at dirPath should be included into the scan
Returns
This function performs a scan of all filesystem objects captured inside of the dirPath folder using the wild-card glob-style pattern. It returns false if dirPath is an invalid path specifier for the translator.
Example
This snippet outputs the count of directories and files in a specified directory relative to the resource instance root. This is an alternative to the scanDir way.
-- Get a handle to the resource instance directory.
local resRoot = fileCreateTranslator( "/" );
local function getFilesystemObjectCounts( path )
local fileCount = 0;
local dirCount = 0;
-- Create iterator closures that are triggered for each file and directory
local function fileIterator( filePath )
-- filePath is always an absolute path.
fileCount = fileCount + 1;
end
local function dirIterator( dirPath )
-- filePath is always an absolute path.
dirCount = dirCount + 1;
end
-- Get a list of all fs objects.
local fsObjects =
resRoot:scanDirEx(
path, -- scan anywhere the script wants us to
"*", -- include all files
dirIterator, -- pass the callbacks to the routine
fileIterator,
false -- scan the specified directory only
);
-- We do not need to loop anymore.
-- Return the counts.
return fileCount, dirCount;
end
-- Output the filesystem object counts for the resource instance root.
local fileCount, dirCount = getFilesystemObjectCounts( "/" );
outputChatBox( "found " .. fileCount .. " files and " .. dirCount .. " directories in the resource folder root." );