Listing 5: Function Recurse
void DirWalk::Recurse() throw(runtime_error) { HANDLE hFind; mDepth++; // if Recurse has been called, // then we're one level lower hFind=FindFirstFile(mSearchSpec,&mFindData); mFoundAnother=(hFind!=INVALID_HANDLE_VALUE); while(mFoundAnother) { mSize = mFindData.nFileSizeLow; // set the file size mSizeHigh = mFindData.nFileSizeHigh; mFA = mFindData.dwFileAttributes; mIsDir= mFA.IsDirectory(); // set up the time objects for this file mCreationTime.NewTime(&mFindData.ftCreationTime); mLastAccessTime.NewTime(&mFindData.ftLastAccessTime); mLastWriteTime.NewTime(&mFindData.ftLastWriteTime); if(!mIsDir) { FoundFile(); // announce each file (but not dirs, yet) } mFoundAnother=FindNextFile(hFind, &mFindData); // next one } if(hFind != INVALID_HANDLE_VALUE) { if (FindClose(hFind) == FALSE) throw runtime_error( "DirWalk::Recurse().Problem closing hFind."); } // OK, we've listed all the files of interest. // Now, we go into subdirectories and list those if we need to if(mRecurse) { hFind=FindFirstChildDir(); mFoundAnother=(hFind != INVALID_HANDLE_VALUE); while(mFoundAnother) { mFA=mFindData.dwFileAttributes; // same game as above mCreationTime.NewTime(&mFindData.ftCreationTime); mLastAccessTime.NewTime(&mFindData.ftLastAccessTime); mLastWriteTime.NewTime(&mFindData.ftLastWriteTime); mSize=mFindData.nFileSizeLow; mSizeHigh=mFindData.nFileSizeHigh; // go into subdirectory if(SetCurrentDirectory(mFindData.cFileName) == TRUE) { if(mListSubDirs) FoundFile(); // announce subdir name Recurse(); //list files in the subdirectory now if(SetCurrentDirectory("..") == FALSE) throw runtime_error( "DirWalk::Recurse(). Prob chnging to parnt dir"); } mFoundAnother=FindNextChildDir(hFind); //next subdir } if(hFind != INVALID_HANDLE_VALUE) { if(FindClose(hFind) == FALSE) throw runtime_error( "DirWalk::Recurse().Problem closing hFind(2)."); } } mDepth--; // we're returning to the parent's depth now } //void DirWalk::Recurse() //End of File