Showing posts with label DotNet. Show all posts
Showing posts with label DotNet. Show all posts

Saturday, May 1, 2010

A simple class to read and write application settings

I'll come straight to the point. All I want to do is save a few setting for my little .NET application like

MaxSizeOfText=256.

Ok, that not all. I want each user to have his own settings. I can do this by storing such settings to a file in the user's appData folder.

Programming in the .NET world is usually pretty easy though a bit frustrating because at times it is painfully easy. There are also times when exisitng classes can get the work done but finding out how exaclty to use these classes is so darned unintuitive that its easier to write the functionality all by yourself.

I consider all classes present in the base-class-library revolving around reading / writing application configuration a big fiasco. There aren't many areas which are as confusing as this. With each version of .NET new ways to access appSettings keep cropping up. Come on, how difficult is to define an easy to understand programmatic access to some XML data? and if you can't do that why not just hide those classes from end developers, we are capable of writing our own.

Here is a class I quickly wrote which allows you to store application settings in a 'name'-'value' form in XML. The file can be located anywhere on your computer. It has just 3 menthods for interacting with it so it's very simple to use. Settings can be added without any special methods, setting can be read and setting can be removed. Minimum requirement, a target file should be present with atleast following xml:


Rest is taken care of by the class. I am sure there must be lots of improvement that can be made and I would appreciate any comments.

The class diagrams is presented below:

class diagram

Here is the complete code for the XmlSettings class:


// ++
// (C) Copyright Siddharth Barman, 2010.
// Copyright notice: You are free to use this material with or without the copyright notice.
// Author is not reponsible for any damage/problems arising out of the use of this material.
// --

using System.Xml;

namespace Sid.Utilities
{
    /// <summary>
    /// Allows reading and writing settings to XML files. The XML files should have
    /// the following structure <settings><setting name="ABC" value="XYZ" /></settings>
    /// </summary>
    public class XmlSettings
    {
        #region Public interface

        /// <summary>
        /// Path to the settings file. The file must exist.
        /// </summary>
        /// <param name="file"></param>
        public XmlSettings(string file)
        {
            this.file = file;
            doc = new XmlDocument();
            doc.Load(file);
        }

        /// <summary>
        /// Returns the settings file being used.
        /// </summary>
        public string SettingsFile
        {
            get { return file; }
        }

        /// <summary>
        /// Allows a setting to be read or written. Each setting is referred by it's name. 
        /// Null is returned if a setting does not exist while reading. 
        /// A new setting is created if it does not exist while writing.
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        public string this[string name]
        {
            get 
            {
                return ReadSetting(name);
            }
            set 
            {
                SetSetting(name, value);
            }
        }

        public void Remove(string name)
        {
            XmlNode node = GetSettingNode(name);

            if (node != null)
            {
                RootNode.RemoveChild(node);
            }
        }

        public void Save()
        {
            doc.Save(file);
        }

        #endregion

        #region Protected and Private members

        protected XmlNode RootNode
        {
            get
            {
                return doc.SelectSingleNode("/settings");
            }
        }

        protected string ReadSetting(string name)
        {
            XmlNode node = GetSettingNode(name);

            if (node == null || node.Attributes.Count == 0 || node.Attributes["value"] == null)
            {
                return null;
            }

            return node.Attributes["value"].Value;
        }

        protected void SetSetting(string name, string value)
        {
            XmlNode node = GetSettingNode(name);

            if (node == null)
            {
                node = CreateSettingNode(name);
            }

            node.Attributes["value"].Value = value;
        }

        protected XmlNode GetSettingNode(string name)
        {
            return doc.SelectSingleNode(string.Format("/settings/setting[@name='{0}']", name));
        }

        protected XmlNode CreateSettingNode(string name)
        {
            XmlNode node = doc.CreateNode(XmlNodeType.Element, "setting", string.Empty);
            RootNode.AppendChild(node);

            XmlAttribute nameAtt = doc.CreateAttribute("name");
            node.Attributes.Append(nameAtt);
            nameAtt.Value = name;

            XmlAttribute valueAtt = doc.CreateAttribute("value");
            node.Attributes.Append(valueAtt);

            return node;
        }

        protected string file;
        protected XmlDocument doc;

        #endregion
    }
}

Tuesday, August 25, 2009

Installing Microsoft products really sucks

Installing Microsoft applications is a fu**ed-up experience.
Why can't they ever get them right?
Ever since the highly touted .NET framework made its appearance, installing anything coming out of Microsoft has become a royal pain.

Thought I'd install SQL Server 2008 developer edition and see the new features. What I am greeted with? A long long long download process from the Internet to get .NET 3.5 SP1. Man! why couldn't they package the offline version on the DVD?

Anyway, after the download is complete, the installation of .NET 3.5 SP1 itself took almost an hour. Why? It takes that much time to install Windows OS in the first place?

Ok, now at least I can select all the cool 'features' of SQL I want to install, I select almost everything and click the dreaded 'Next' button. Whay do I see? I am now told to install SP1 of Visual Studio first before installing SQL 2008 Man, that's the final straw. Is this the way to make software?

That's not all, go to the download page for .NET SP1 on Microsoft's site:
http://www.microsoft.com/downloads/details.aspx?FamilyID=ab99342f-5d1a-413d-8319-81da479ab0d7&displaylang=en

This is taken right from the page:
"IMPORTANT: After installing the .NET Framework 3.5 SP1 package (either the bootstrapper or the full package) you should immediately install the update KB959209 to address a set of known application compatibility issues.
In addition, on Windows Vista x64 and Windows Server 2008 x64, install the update KB967190
to address a file association issue for XPS documents."


HAHAHA! Installing SP1 itself requires installing another fix on it immediately! hehehe.. Don't ask if installing the fix requires you to install another something, I am too scared to go check.

Where have all the 'real' developers gone from Microsoft?