Mapped File Class


CMappedFile was created after some users complained that my apps were
storing too much data in the Registry. I needed a way to preserve the
multilevel data heirarchy that the Registry provides, but I needed to
do it in external files. In addition, I wanted some protection from
curious eyes.

CMappedFile is essentially a CMap of COleVariants that will serialize
itself to and from files. It supports long, bool,
and double. But, because you
can cast just about any basic type into a long,
you can store just about anything. Plus, it should be fairly simple to
extend this class to hold anything a COleVariant can hold.

To provide key support, three functions, SetBaseKey,
SetSubKey and MoveUp
are provided.

  • SetBaseKey(key) allows you to set
    the root key for all
    subsequent read and write operations.
  • SetSubKey(subKey) moves the current key
    “down” to the specified subkey.
  • MoveUp() moves the current key “up” to the
    parent key.

The following example write five values to a CMappedFile, in two different
keys, and writes the file. Then, it reads the file back into a different
CMappedFile and verifies the results. Pretty simple.

// stupid data values
double pi = 3.14159;
CString hi = "Hi There!";
long fiftyFive = 55;
bool thisWorks = true;
bool thisDoesNotWork = false;

CMappedFile mf;

// start off with a key called "Root"

// Root\Pi : 3.14159
mf.Set("Pi", pi);

// Root\Hi : Hi There!
mf.Set("Hi", hi);

// move down a subkey

// Root\Subkey\Success : true
mf.Set("Success", thisWorks);

// Root\Subkey\55 : 55
mf.Set("55", fiftyFive);

// Root\Failure : false
mf.Set("Failure", thisDoesNotWork);

// dump this to the debug output window

// save it to a file

// "" now holds the following values : 
// Root\Pi : 3.14159
// Root\Hi : Hi There!
// Root\Subkey\55 : 55
// Root\Subkey\Success : true
// Root\Failure : false

// read it back, to a different CMappedFile, to be safe
CMappedFile mf2;

ASSERT(mf2.Get("Hi", "Bye") == hi);
ASSERT(mf2.Get("Pi", -1.0) == pi);

ASSERT(mf2.Get("55", (long)-1) == fiftyFive);
ASSERT(mf2.Get("Success", false) == true);

ASSERT(mf2.Get("Failure", true) == false);

Download source – 4 KB

More by Author

Must Read