Me again, and again with enumeration techniques. In this post I will try to coven a very common problem all programmers have to face one time or another: enumerating all files recursively in a directory.
Yesterday I had to do it again, and again following the standard FindFirst … FindNext and FindClose pattern. So I decided to make my life easier and use enumerators for that. Behold the results:
var S: String; begin for S in TDirectory.Entries('I:', true) do WriteLn(S); end;
That’s all you have to do to traverse the directory structure for the I:\ drive — simple and clean.
So how does this work and what are the advantages:
- The method Entries is a static method of TDirectory structure. There are two more methods: Files, which returns only files and Directories which returns only directories.
- The exposes static methods return an IEnumerable<String> interface which exposes the GetEnumerator() method. This is an important aspect of the implementation since exposing an interface helps you pass the lifetime management of the enumerable object to the compiler.
- The for .. in loop then extracts a IEnumerator<String> interface and starts iterating over the directory tree.
- The TDirectory.TEnumerator object does not use recursion internally to traverse the tree. It stores the TSearchRec at each level in a TStack<> instance (well it’s kinda like recursion).
- You can “break” off the loop at any moment. Simple and easy.
- It executes more instruction per iteration but I think it’s a manageable trade-off for its ease of use.
Again, th unit can be found here: [download#40].