MTA:Eir/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." );