private void button2_Click(object sender, EventArgs e)
{
SaveToFile(this.Controls);
}
private void button3_Click(object sender, EventArgs e)
{
LoadFromFile(this.Controls);
}
private static byte[] key = Encoding.UTF8.GetBytes("MySecretKey1234").Concat(Encoding.UTF8.GetBytes(new string('0', 16))).Take(16).ToArray();
private static byte[] iv = new byte[16]; // 128 bit
public static void SaveToFile(Control.ControlCollection controls)
{
string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "configuration");
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
// File path and name
string fileName = Path.Combine(path, "config.txt");
// Create an AES object and set the key and IV based on the specified values
using (Aes aes = Aes.Create())
{
aes.Key = key;
aes.IV = iv;
// Write the values of checkboxes and textboxes to the file, encrypted with AES
try
{
using (StreamWriter sw = new StreamWriter(fileName))
using (CryptoStream cs = new CryptoStream(sw.BaseStream, aes.CreateEncryptor(), CryptoStreamMode.Write))
{
using (StreamWriter swCrypto = new StreamWriter(cs))
{
foreach (Control c in controls)
{
if (c is CheckBox)
{
CheckBox cb = (CheckBox)c;
swCrypto.WriteLine(cb.Name + "=" + cb.Checked);
}
else if (c is TextBox)
{
TextBox tb = (TextBox)c;
swCrypto.WriteLine(tb.Name + "=" + tb.Text);
}
}
}
}
}
catch (Exception ex)
{
MessageBox.Show("An error occurred while saving configuration data: " + ex.Message);
}
}
}
public static void LoadFromFile(Control.ControlCollection controls)
{
string fileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "configuration", "config.txt");
// Create an AES object and set the key and IV based on the specified values
using (Aes aes = Aes.Create())
{
aes.Key = key;
aes.IV = iv;
// Read the values of checkboxes and textboxes from the file, decrypted with AES
try
{
using (StreamReader sr = new StreamReader(fileName))
using (CryptoStream cs = new CryptoStream(sr.BaseStream, aes.CreateDecryptor(), CryptoStreamMode.Read))
{
using (StreamReader srCrypto = new StreamReader(cs))
{
while (!srCrypto.EndOfStream)
{
string line = srCrypto.ReadLine();
string[] parts = line.Split(new char[] { '=' }, 2);
if (parts.Length == 2)
{
Control c = controls.Find(parts[0], true).FirstOrDefault();
if (c != null)
{
if (c is CheckBox)
{
bool value = false;
if (bool.TryParse(parts[1], out value))
{
((CheckBox)c).Checked = value;
}
}
else if (c is TextBox)
{
((TextBox)c).Text = parts[1];
}
}
}
}
}
}
}
catch (Exception ex)
{
MessageBox.Show("An error occurred while loading configuration");
}
}
}
Messagebox show
My fisrt question: Even if the error message appears, it writes and reads config.txt in the background. But why am I getting this error message? How do I update the codes? Where am I doing wrong?
My second question: SaveToFile is written in a single name here. What I want to do exactly is to create a new config file by randomly numbering the automatic config.txt in the specified file every time I save to file (For example: 123456789_config.txt, 123456788_config.txt). How can I fix for this?
My third question: While Open From File, it reads directly from the file itself. But I want to specify myself which file it should read through the File bower. How can I arrange?