Date: 12 February 2000
Author: Hasfjord at btinternet dot com
TFileNameIterator is a nice gem in the class library. It encapsulates Win32 FindFirstFile and FindNextFile calls. Unfortunately, it has a bug: The internal iterator flag isn't set correctly when no files are found, hence always indicating one or more files.
Here is a bug-fix in the form of a proxy header. Include this header instead of <classlib/filename.h> and use TFileNameIterator as normal --- no need to rebuild classlib!
// classlib/filename.h proxy - fixes bug in TFileNameIterator // Vidar Hasfjord, 2000 // This file fixes a bug in TFileNameIterator: // The Done flag is not properly set when no file is found. #ifndef _FILENAME_H_FIX #define _FILENAME_H_FIX // Scream if classlib/filename.h has already been included. #if defined(CLASSLIB_FILENAME_H) #error classlib/filename.h already included --- can't patch! #endif // Include the same headers as classlib/filename.h does. // Include these here to avoid macro trickery in these files (see below). #if !defined(CLASSLIB_DEFS_H) # include <classlib/defs.h> #endif #if !defined(SERVICES_CSTRING_H) # include <services/cstring.h> #endif #include <dir.h> // struct ffblk #if !defined(CLASSLIB_FILE_H) # include <classlib/file.h> #endif // Include classlib/filename.h. // Force access to private parts by macro trickery (damned Classlib designers :-). #define Handle Handle;friend class TFileNameIterator_fix #include <classlib/filename.h> #undef Handle // Derive a new class that fixes the bug. #if defined(BI_NAMESPACE) namespace ClassLib { #endif class TFileNameIterator_fix : public TFileNameIterator { public: TFileNameIterator_fix (const string& wildName) : TFileNameIterator (wildName) { // Ensure that Done is set properly. Done = Handle == INVALID_HANDLE_VALUE; } }; #if defined(BI_NAMESPACE) } // namespace ClassLib #endif // Redefine ordinary name to fixed one. #define TFileNameIterator TFileNameIterator_fix #endif