views:

914

answers:

6

Hi Guys,

I want to migrate the settings file I am currently using to appconfig file. At the moment I am trying to make a copy of it but so far I cannot even get it to write to the file using the Config' Manager.

What I need to do is first create the file and then write to it and finally of it already exists, update it!. Seems pretty simple but so far its eluding me at every turn. All the materials I have referred to so far ALL ASSUME it exists. Even the MS MCTS reference book has a config file already made for the examples.

Is there a programmatic way of creating it and then writing to the default bin folder of the application assuming you have sufficient privileges.

The examples make this look soo simple but when you look at the timestamps on the file in question ....scratches his head ... hat falls !

I mean are they different types of config files? I know of web.config and app.config but how much do people really deviate from this simple naming template???

Thanks for any replies. Ibrar

A: 

i've scratched my head over the config files myself. In the end i have opted to simply create my own settings class and (de)serialize it as XML to/from disc as needed.

Considerations to serializing your own settings file:

  • More flexible
  • You have to write more code
  • Type safe (refer to setting by type rather than string ID)

Tons of other considerations of course, but the third is my fave.

Paul Sasik
Im aware of this method but seems like too much bother as I yet to use the serialization classes.
IbrarMumtaz
+4  A: 

First of all, You say app.config is a config file. It is not. It is the source file within Visual Studio that is used by VS to create the config file during compilation. During Compilation, if Visual Studio detects an app.config, it copies it to the output folder of the compilatuion and renames it to (assuming the fully qualified name of your assembly is NameSpace.your.applicationName),

NameSpace.your.applicationName.exe.config

That is the file you should be looking for, and reading/writing to in any custom code you are writing.

As other answer mentions, be careful doing this. it is not trivial. this file is only a portion of a complete system that the CLR uses to manage configuration for your application, and you can mess it up easily.

FInally, please investigate the config file element called configSource. Using this, you can place an element in your app.config that "redirects" the configuration system to look in a separate file for a specific config section. You would use it by modifying the section element in the app.config like this:

<MyConfigSectionName configSource="ConfigFolder\MySpecConfigFile.xml" />

or, to move an existing .Net config section to a separate file,

<appSettings configSource="ConfigFolder\MyAppSettings.xml" />

Then you can create a separate config file with the settings you want in it, and open, read, and write to that file...

contents of file MyAppSettings.xml:

<?xml version="1.0" encoding="utf-8" ?>

<appSettings>
  <add key="limitToSingleInstance" value="true"/>
  <add key="maximumCacheFiles" value="1000"/>
  <add key="maximumThreadCount" value="5"/>
</appSettings>
Charles Bretana
Hey, I am really struggling with this??My question is .. does the project need an exisiting .config file for this too work?? As I am using an MCTS exam book as an example. He has no config files anywhere in his solution yet in his output directory he has one like "applicationname.exe.config". Neither does he have one his solution ... all he has is the config reference correctly referenced in his project and the following line. "Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);"Thats all he has ... and somehow he can read and write???
IbrarMumtaz
Yes, if he has an applicationname.exe.config in the output folder, then somewhere in the solution there is an app.config...
Charles Bretana
+1  A: 

Here is an example of how to create a custom config file, store some configuration data, and then read it back along with some if exists statements to create it if it needs to be. Hopefully it won't be that much trouble to translate it into C#.

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    If System.IO.File.Exists(System.IO.Directory.GetCurrentDirectory() + "\Settings.Config") Then
        FileOpen(1, System.IO.Directory.GetCurrentDirectory() + "\Settings.Config", OpenMode.Random, OpenAccess.ReadWrite)
        FileGet(1, SettingVar1, 1)
        FileGet(1, SettingVar2, 2)
        FileGet(1, SettingVar3, 3)
        'etc
        FileClose(1)
    Else
        FileOpen(1, System.IO.Directory.GetCurrentDirectory() + "\Settings.Config", Openmode.Random, OpenAccess.ReadWrite)
        FilePut(1, "Static Setting to write", 1) 'insert a string
        FilePut(1, 3, 2) 'insert a number
        FilePut(1, New DBMC, 3) 'Any object
        'etc...
        FileClose(1)
    End If
End Sub

It should probably be noted that .NET has a built in Settings file that VB can reference (My.Settings) that would do the same thing as this but without the overhead of managing the file through code. There is also the registry for saving settings variables (if you're feeling brave and promise to clean up the registry when your program gets uninstalled), and many other correct ways of doing this.

Also, please note that many developers frown on using random access files and they are generally not used much anymore because of certain overhead costs associated with large random access files. However, for the sake of simplicity, a random access file is a very easy-to-understand way of creating and controlling a config file.

Jrud
Hey dude thanks for the reply. I am C# coder so waaaah !
IbrarMumtaz
lol I know you are a C# coder, but VB and C# have the exact same framework behind them. It requires little effort to convert the code from one language to the other. In fact, i've even seen some online tools that can do this for you automagically.
Jrud
A: 

Got it working.

1) Firstly add a config file to your project.

2) Name or rename it to the name of application -like-for-like.

3) Make sure it ends with .config

4) Set the property on the config file so that it is copied out to the output folder.

5) Make sure your project correctly references the configuration assembly under project references.

6) Create the configuaration object like so for e.g:

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

--> Stick with the "None" on the enumeration object for now ... experiment later for different users and etc.

7) Debug your project and run it a few times to make sure the config object is correctly picking up the config file and its file path property correctly points to the location of the config file. So at Run time this is going to be under \bin\debug\ .... -----> Check for the has ffile property also and make sure its true also.

8) At this stage, the config object is properly set-up and is ready to go. Now add your entries as though you were adding entries into a Hashtable or a Dictionary using the key-value pairs notion.

config.AppSettings.Settings.Add("Key", "Value");

9) Once you have added in some sample test data, last thing to do iss to save the config.

config.Save();

10) Finally, navigate to the build output folder and check to see if the file config file has changed.

UPDATE: You might find that vshost.exe file that ends up in the output directory might mess things up as I noticed my config object was pointed to one of these xml file and not my config file. Outside of the VS IDE this is O.K as the vhsost file is not deployed and not used but in the IDE its nice to get it all working in there. So follow my post below if this happens.

That was the answer I was more or less looking for ... Thanks for all the replies i got anyways.

IbrarMumtaz
COMMENT: Further info can be found here but I got confused trying out some of the ideas and suggestions found in here so you've been warned.http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/3943ec30-8be5-4f12-9667-3b812f711fc9
IbrarMumtaz
A: 

Even though this is not answer but a follow up from the previous post.

private void saveAllMenuItem_Click(object sender, EventArgs e)
    {
        // Set up the config object .... with a default user level.
        Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

        if (isWindowsDriveSet())
        {
            // Save the drive name and write it to a config file.
            config.AppSettings.Settings.Add("Drive", WindowsDrive());
        }
        else
        {
            MessageBox.Show("Please set your windows drive before proceeding!", "Windows Drive Not Set!",
                MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
        }

        if (ShowHiddenFilesSetting()) // only true (executes) if the app is showing 'ALL' files.
        {
            config.AppSettings.Settings.Add("FileSettings", FileSettings());
        }
        else // else default is implied.
        {
            config.AppSettings.Settings.Add("FileSettings", FileSettings());            
        }

        // Notify the user that the method has completed successfully.
        toolStripStatusLabel.Text = "Settings saved.";

        // Log to the logger what has just happened here.
        ActionOccured(this, new ActionOccuredEventArgs("0", DateTime.Now.ToString(), "The user has saved his settings."));

        // Finally save to the config.
        config.Save();
    }

Above is my 'Save()' method that saves application settings. While I did manage to get it working ... i found that after testing and wiping my area down on each build I found that rather my application automatically look for 'MyFileExplorer.config' it instead looks for a vshost.exe.config file of some sort. I have no idea why it is looking for this file? As the filePath property is an accessor property so I can't change it's value.

I will experiment further see if i can get it to work again !

IbrarMumtaz
I literally had to change my config file to MyFileExplorer.exe.config.And ...Configuration config = ConfigurationManager.OpenExeConfiguration("MyFileExplorer.exe");Now it works as expected after doing some quick reserahc on the vshost file. This is the best to way to proceed.
IbrarMumtaz
A: 

Thanks for the follow-up. Saved me tons of research on the exact way to go about this.

MoCsharp
haha no problem.
IbrarMumtaz