You mentioned you have thousands of files. #directoryTreeDo: is the most-efficient approach performance-wise (including the least amount of garbage production), but also the simplest in terms of code length and complexity. It was designed to handle this exact use-case.
From the directory returned from your DirectoryChooser, you can write:
rootDirectory directoryTreeDo:
[ : path |
"... do your work with Authors and Cards using 'path',
which is a Collection of DirectoryEntry's ..." ]
The first element of the 'path' OrderedCollection will always be the DirectoryEntryDirectory for myDirectory. The subsequent items represent the path to the current item you wish to process.
It's an object-oriented design that provides the user with the most information to support the broadest range of use-cases, while being simple and efficient.
You might consider attach the entries themselves straight to your Card objects if you want! That would capture not only the directory location and filename, but the "size", "lastModified" date, too.