Using Enumerators in C/AL to iterate through files in a folder
26th March 2013
Enumerators in .NET allow you to iterate through arrays and collections in your class. You can see this used for example in FOREACH Loop. Here is an example.
DirectoryInfo di = new DirectoryInfo("c:\\temp");
FileInfo[] files = di.GetFiles("*.pdf”);
foreach (FileInfo fileInfo in files)
{
Console.WriteLine(FileInfo.Name)
}
There is no way to translate FOREACH loop in C/AL, but there is a workaround using List class.
In the above example, DirectoryInfo returns an array of FileInfo . In FOREACH loop we are looping through each file and printing it to console screen.
So the first line in NAV is initializing DirectoryInfo with constructor
DirectoryInfo := DirectoryInfo.DirectoryInfo('C:\temp\');
The second line is where we are changing and assigning it to a List. The CAL Compiler should error out but it is not. It looks like it’s not doing any type checking. At runtime it is determining the object type returned. DirectoryInfo.GetFiles().ToList() ;
List := DirectoryInfo.GetFiles('*.txt');
enumerator := List.GetEnumerator();
Once we have a list of enumerator class then we can loop through each object
WHILE enumerator.MoveNext DO BEGIN
FileInfo:= enumerator.Current();
MESSAGE('%1',FileInfo.Name);
END;
Here is the whole Code with Variable type
| DirectoryInfo | DotNet | System.IO.DirectoryInfo.’mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089′ |
| FileInfo | DotNet | System.IO.FileInfo.’mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089′ |
| List | DotNet | System.Collections.Generic.List`1.’mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089′ |
| enumerator | DotNet | System.Collections.IEnumerator.’mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089′ |
DirectoryInfo := DirectoryInfo.DirectoryInfo('C:\temp\');
List := DirectoryInfo.GetFiles('*.txt');
enumerator := List.GetEnumerator();
WHILE enumerator.MoveNext DO BEGIN
FileInfo:= enumerator.Current();
MESSAGE('%1',FileInfo.Name);
END;
Posted in DotNet, Dynamics NAV 2013 | Comments Off