How much work should be done in a constructor?
You usually do not want the constructor to do any computation. Someone else using the code will not expect that it does more than basic set-up.
For a directory tree like you're talking about, the "elegant" solution is probably not to build a full tree when the object is constructed. Instead, build it on demand. Someone using your object may not really care what is in sub-directories, so start out by just having your constructor list the first level, and then if someone wants to descend into a specific directory, then build that portion of the tree when they request it.
To summarize:
At a minimum, your constructor needs to get the object configured to the point that its invariants are true.
Your choice of invariants may affect your clients.(Does the object promise to be ready for access at all times? Or only only in certain states?) A constructor that takes care of all of the set-up up-front may make life simpler for the class's clients.
Long-running constructors are not inherently bad, but may be bad in some contexts.
For systems involving a user-interaction, long-running methods of any type may lead to poor responsiveness, and should be avoided.
Delaying computation until after the constructor may be an effective optimization; it may turn out to be unnecessary to perform all the work. This depends on the application, and shouldn't be determined prematurely.
Overall, it depends.