MTA:Eir/FileSystem/translator/scanDirEx: Difference between revisions
m (→Example) |
mNo edit summary |
||
(One intermediate revision by one other user not shown) | |||
Line 4: | Line 4: | ||
==Syntax== | ==Syntax== | ||
<syntaxhighlight lang="lua"> | <syntaxhighlight lang="lua"> | ||
bool translator | bool translator:scanDirEx ( string dirPath, string wildcard, function dirCallback, function fileCallback, bool recursive ) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Line 10: | Line 10: | ||
*'''dirPath:''' a path to the directory the scan shall take place or start in | *'''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 | *'''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) | *'''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) | *'''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 | *'''recursive:''' a boolean that specifies whether the whole directory tree at dirPath should be included into the scan | ||
Line 41: | Line 41: | ||
-- Get a list of all fs objects. | -- Get a list of all fs objects. | ||
local fsObjects = | local fsObjects = | ||
resRoot | resRoot:scanDirEx( | ||
path, -- scan anywhere the script wants us to | path, -- scan anywhere the script wants us to | ||
"*", -- include all files | "*", -- include all files |
Latest revision as of 23:29, 16 January 2022
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." );