tags:

views:

1171

answers:

4

I'm trying to write a C# program, where when a user enters some data into a text box and clicks on a "save" button, the information is stored in some sort of file that when the program is opened the next time around, the information is automatically loaded in.

I'm using Visual C# express. What's the best way to do this without requiring some sort of database like MySQL or MSSQL or Access?

If the only way or easiest way is a database, I'd rather use Access. If so, does the user of the program need Access installed for my program to run on their computer? What if I go with another database?

p.s.

I forgot to mention, I'd rather the user not be able to access this file and read the contents easily. Text file without encryption would be easy to open. Any way to encrypt this? Also, if I use a delimiter like ':', then that means the user cannot use that character. So any other way?

Thanks!

A: 

If it's very simple then you could place it in a plain text file. For more structured data you could consider storing it as a CSV and parsing it or creating an XmlDocument and saving that to disk.

Andrew Kennan
+3  A: 

Make your user data serializable by adding the keyword:

[Serializable]

above your data structure. When you load the dialog box, load your serialized structure from disk, and when you leave the dialog, save the data structure.

From a style standpoint, you should probably not have the dialog box change data until the dialog box is closed (if it's modal).

To save:

    private bool Save(String inFileName, MyObject inObject){
        try {
            FileStream theStream = File.Open(inFileName, FileMode.Create);

            BinaryFormatter theFormatter = new BinaryFormatter();
            theFormatter.Serialize(theStream, inObject);//add it to the end there
            theStream.Dispose();
            theStream.Close();
        } catch{
            return false;
        }
        return true;

    }

To Load:

    private MyObject Read(String inFileName){
        MyObject theReturn = null;
        try {

            FileStream theStream = File.Open(inFileName, FileMode.Open, FileAccess.Read);                

            BinaryFormatter theFormatter = new BinaryFormatter();
            theReturn = (CImageData)theFormatter.Deserialize(theStream);//add it to the end there
            theStream.Dispose();
            theStream.Close();
        }
        catch {
            return null;
        }
        return theReturn;
    }

You can also use 'using' on a stream, but this code is pretty straightforward, I think. It also means that you can add more items into MyObject.

Edit: For encryption, you can add in AES or something similar. That might be overkill for you, and saving the file as binary may make it readable by something like notepad, but not easily editable. Here's a lengthy explanation on real encryption:

http://msdn.microsoft.com/en-us/magazine/cc164055.aspx

mmr
+1  A: 

If your application is only to be used by a single person then simply store your data in a file (XML would give you some structure)

If your application will be used by multiple people and the data shared among them, then a database is your best option. If you use a database then yes you will need to have a database installed on your users computer, though it is possible to do that transparantly to your user, for that you are best off with an embeddable database, something like MySQL would be your best bet.

(EDIT: the database actually does not have to be on the users computer, but he would need to be able to see it from his coputer)

Tim Jarvis
+1  A: 

Sql Compact Edition would hide the data from being easily accessible (and its free). You can also password protect a CE database. A SQL CE database is contained completely in an .SDF file, like Access, so you can copy the .sdf file around and not have to worry about network connectivity, etc.

scottm