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." );