Looks pretty clean to me. Just don't put all that directly in the calling code so you don't have to look at it all the time. Make your own CopySubDir class that hides all this code and provides a simple to understand interface to it. Then the calling code will look clean.