Listing 1: Header for class DirWalk

class DirWalk {
private:

 // Member variables that affect the object as a whole
    BOOL mRecurse;                        // Recurse subdirectories?
    BOOL mListSubDirs;                    // Process subdir names?
    char mSearchSpec[_MAX_PATH];          // Files must match this
    char mStartingDirectory[_MAX_PATH];   // Where walk begins
#if defined(_MT)
 char mCurrentDirectory[_MAX_PATH];
 char mCurrentDirectorySearch[_MAX_PATH];
 char mFullPathName[_MAX_PATH];
#endif

 // Member variables that deal only with the current file
    BOOL mFoundAnother;   // Found another in the current directory?
    BOOL mIsDir;                   // Is this one a directory
    DWORD mSize;                   // Current file size
    DWORD mSizeHigh;               // High double word of file size
    int mDepth;                    // Current file's recursion level
    WIN32_FIND_DATA mFindData;     // Much info on current file
    enum { ShortFileNameLength=13 };
    char mShortFileName[ShortFileNameLength];  // Holds the 8.3 name
 
 // Performs some initializations common to all the constructors
    void ConstructorHelper(const BOOL RecurseSubDirs,
                           const BOOL ListSubDirs) throw();
    void Recurse() throw(runtime_error);  //Performs the actual work
    BOOL IsChildDir() const throw();
    HANDLE FindFirstChildDir() throw();
    BOOL FindNextChildDir(HANDLE hFindFile) throw();

protected:

 // Recursion level of the current file
    inline int Depth()   const throw() { return mDepth; }
 // Size of current file. Use SizeHigh() if over 4.2GB.
    inline DWORD Size()   const throw() { return mSize;  }
    inline DWORD SizeHigh()  const throw() { return mSizeHigh; }
    FileAttributes mFA;
    FileTime mCreationTime;
    FileTime mLastAccessTime;
    FileTime mLastWriteTime;

    inline const char* const Filename() const throw() {
        return mFindData.cFileName; }
    const char* const ShortFilename() throw();
#if defined(_MT)
 const char* const FullPathName() throw();
#endif
 // FoundFile() is called whenever another file or directory is
 // found that meets the criteria in effect for the object. This
 // must be overridden in derived classes.
    virtual void FoundFile()=0;

public:

#if defined(_MSC_VER)
    DirWalk(const BOOL RecurseSubDirs=TRUE,
            const BOOL ListSubDirs=TRUE);
    DirWalk(const char* StartingDirectory,
            const BOOL RecurseSubDirs=TRUE,
            const BOOL ListSubDirs=TRUE);
    DirWalk(const char* StartingDirectory,
            const char* SearchSpec, const BOOL RecurseSubDirs=TRUE,
            const BOOL ListSubDirs=TRUE);
#else
   DirWalk(const BOOL RecurseSubDirs=TRUE,
           const BOOL ListSubDirs=TRUE) throw();
   DirWalk(const char* StartingDirectory,
           const BOOL RecurseSubDirs=TRUE,
           const BOOL ListSubDirs=TRUE) throw();
   DirWalk(const char* StartingDirectory,const char* SearchSpec,
           const BOOL RecurseSubDirs=TRUE,
           const BOOL ListSubDirs=TRUE) throw();
#endif
   void Walk() throw(runtime_error); // Begin the journey.
};
/* End of File */