<file:list config-ref="File_Config" directoryPath="relativePath" />
List Files Using the File Connector
Use the List
operation to list the files and folders in the path pointed to by the directoryPath
parameter. The List
operation returns an array of messages in which:
-
Each message holds the file’s content in its payload.
-
The file’s attributes section carries the file’s metadata (such as name, creation time, and size).
-
The payload is empty if the element is a folder.
The List
operation requires the directoryPath
parameter, which represents the relative path of the directory to list, unless you specify the full path of the directory. The path is relative to the working directory value defined in the configuration referenced by the config-ref
parameter. If no configuration is referenced, the working directory defaults to the value of the user.home
system property. If the system property is not set, the connector fails to initialize.
For an example of setting a configuration, see File Connection Settings.
Next is an example of a List
operation that references a file configuration and thus uses
a relative path:
As mentioned earlier, this returns an array of messages. In Anypoint Studio, DataSense displays the metadata for the operation’s output:
The |
Read Files Returned by List
The following example lists all files and folders in directoryPath
and, in a foreach
loop:
<file:list config-ref="File_Config" directoryPath="relativePath" />
<foreach>
<choice>
<when expression="#[not attributes.directory]">
<logger message="Found file #[attributes.path] whose content is: #[payload]" />
</when>
<otherwise>
<flow-ref name="process-directory" />
</otherwise>
</choice>
</foreach>
The foreach
loop determines whether each element is a file or folder with a choice
component. If the element is a file, then a Logger outputs its
path and contents. If the element is a directory, it is sent to another flow for processing.
There is no Read
operation inside the foreach
loop because, as mentioned earlier, the List
operation already returns the file’s content in the payload, (but in
a lazy manner), so there is no need to worry about performance or overhead when the stream is not
consumed in the end.
List Files and Folders Within Subfolders
To list files or folders within any subfolders of the directoryPath
, such as a recursive list, you
can set the recursive
parameter to true
.
<file:list config-ref="File_Config" directoryPath="relativePath" recursive="true" />
Filter Files by Matching Criteria
You can use the <file:matcher>
element to filter files based on the matching criteria you use for
accepting or rejecting a file. Here is an example of file matching rules you can use:
<file:matcher
filenamePattern="a?*.{htm,html,pdf}"
path-pattern="a?*.{htm,html,pdf}"
createdSince="2019-06-03T13:21:58+00:00"
createdUntil="2019-07-03T13:21:58+00:00"
updatedSince="2019-05-03T13:21:58+00:00"
updatedUntil="2019-06-03T13:21:58+00:00"
accessedSince="2019-06-03T13:21:58+00:00"
accessedUntil="2019-06-03T13:21:58+00:00"
directory="true|false"
regularFile="true|false"
symbolicLink="true|false"
minSize="0"
maxSize="1024" />
All of the attributes above are optional and are ignored if not provided. They all relate to each other under an AND
operator.
Time Between Size Checks Parameter
If you want to read the file contents returned by the List
operation, but you are not sure if the file
is still being written to, you can use the TimeBetweenSizeChecks
parameter, which works
with the TimeBetweenSizeCheckUnit
parameter. Combined, these two parameters perform two size checks:
-
One when the flow reaches a point where the stream is about to be consumed. The time check is not done in the
List
operation becauseList
returns a lazy stream pointing to the file’s content, so it makes sense to do the size check only when the stream is about to be consumed. -
Another check is performed after the wait time set by the
TimeBetweenSizeChecks
andTimeBetweenSizeCheckUnit
parameters
If both size checks return the same file size, then the stream is consumed successfully. If the two size checks return different file sizes, then the file is still being written to, so the stream is not consumed and the operation fails with an error.
Repeatable Streams
The List operation makes use of the repeatable streams functionality introduced in Mule 4. The operation returns a list of messages, where each message represents a file in the list and holds a stream to the file. A stream is repeatable by default.
For more information, refer to Streaming in Mule 4.