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, LPCSTR 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"
mf.SetBaseKey("Root");

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

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

// move down a subkey
mf.SetSubKey("Subkey");

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

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

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

// dump this to the debug output window
mf.Dump();

// save it to a file
mf.Write("test.mf");

// "test.mf" 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;
mf2.Read("test.mf");

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

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

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

Download source - 4 KB



Comments

  • There are no comments yet. Be the first to comment!

Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • Live Event Date: April 22, 2014 @ 1:00 p.m. ET / 10:00 a.m. PT Database professionals — whether developers or DBAs — can often save valuable time by learning to get the most from their new or existing productivity tools. Whether you're responsible for managing database projects, performing database health checks and reporting, analyzing code, or measuring software engineering metrics, it's likely you're not taking advantage of some of the lesser-known features of Toad from Dell. Attend this live …

  • With JRebel, developers get to see their code changes immediately, fine-tune their code with incremental changes, debug, explore and deploy their code with ease (both locally and remotely), and ultimately spend more time coding instead of waiting for the dreaded application redeploy to finish. Every time a developer tests a code change it takes minutes to build and deploy the application. JRebel keeps the app server running at all times, so testing is instantaneous and interactive.

Most Popular Programming Stories

More for Developers

Latest Developer Headlines

RSS Feeds