Github: [https://github.com/CarterWu-M/CS-WinForm_data-file-read-write]
This article introduces how to read and write three types of data formats: .ini, .xml, and .json. By working with these formats, you can get a sense of the complexity involved in handling each format.


---
### .ini file
---



```c#=
internal class IniFile
{
public string Path { get; set; }
[DllImport("kernel32", CharSet = CharSet.Unicode)]
private static extern long WritePrivateProfileString(string section, string key, string value, string filePath);
[DllImport("kernel32", CharSet = CharSet.Unicode)]
private static extern int GetPrivateProfileString(string section, string key, string defaultValue, StringBuilder retVal, int size, string filePath);
public IniFile(string path)
{
Path = path;
}
public void Write(string section, string key, string value)
{
WritePrivateProfileString(section, key, value, Path);
}
public string Read(string section, string key)
{
var retVal = new StringBuilder(255);
int ret = GetPrivateProfileString(section, key, "", retVal, 255, Path);
if (0 == ret)
{
// Check for last error if needed
int errorCode = Marshal.GetLastWin32Error();
Console.WriteLine($"Error reading INI file: {errorCode} (0x{errorCode:X})");
}
return retVal.ToString();
}
}
```

```c#=
public partial class Form1 : Form
{
string szIniFilePath = "Data/data.ini";
private Dictionary<TextBox, (string, string)> _arrIniT;
public Form1()
{
InitializeComponent();
initTable();
readIniFile();
}
private void initTable()
{
this._arrIniT = new Dictionary<TextBox, (string, string)>
{
{txtR1Min, ("TestPoint1", "ImpedanceMin")},
{txtR1Max, ("TestPoint1", "ImpedanceMax")},
{txtV1Min, ("TestPoint1", "VoltageMin")},
{txtV1Max, ("TestPoint1", "VoltageMax")},
{txtI1Min, ("TestPoint1", "CurrentMin")},
{txtI1Max, ("TestPoint1", "CurrentMax")},
{txtP1Min, ("TestPoint1", "PowerMin")},
{txtP1Max, ("TestPoint1", "PowerMax")},
{txtR2Min, ("TestPoint2", "ImpedanceMin")},
{txtR2Max, ("TestPoint2", "ImpedanceMax")},
{txtV2Min, ("TestPoint2", "VoltageMin")},
{txtV2Max, ("TestPoint2", "VoltageMax")},
};
}
private void readIniFile()
{
var iniFile = new IniFile(szIniFilePath);
foreach (var item in this._arrIniT)
{
item.Key.Text = iniFile.Read(item.Value.Item1, item.Value.Item2);
}
}
private void writeIniFile()
{
var iniFile = new IniFile(szIniFilePath);
foreach (var item in this._arrIniT)
{
iniFile.Write(item.Value.Item1, item.Value.Item2, item.Key.Text);
}
}
private void btnRead_Click(object sender, EventArgs e)
{
readIniFile();
}
private void btnWrite_Click(object sender, EventArgs e)
{
writeIniFile();
}
private void btnClear_Click(object sender, EventArgs e)
{
foreach (Control control in this.Controls)
{
if (control is TextBox textBox)
{
textBox.Clear();
}
}
}
}
```
---
### .xml file
---



```C#=
public partial class Form1 : Form
{
string szXmlFilePath = "Data/data.xml";
private XmlDocument _doc = new XmlDocument();
private Dictionary<TextBox, string> _arrXmlT;
public Form1()
{
InitializeComponent();
initTable();
readXmlFile();
}
private void initTable()
{
this._arrXmlT = new Dictionary<TextBox, string>
{
{txtR1Min, "/root/TestPoint1/Impedance/Min"},
{txtR1Max, "/root/TestPoint1/Impedance/Max"},
{txtV1Min, "/root/TestPoint1/Voltage/Min"},
{txtV1Max, "/root/TestPoint1/Voltage/Max"},
{txtI1Min, "/root/TestPoint1/Current/Min"},
{txtI1Max, "/root/TestPoint1/Current/Max"},
{txtP1Min, "/root/TestPoint1/Power/Min"},
{txtP1Max, "/root/TestPoint1/Power/Max"},
{txtR2Min, "/root/TestPoint2/Impedance/Min"},
{txtR2Max, "/root/TestPoint2/Impedance/Max"},
{txtV2Min, "/root/TestPoint2/Voltage/Min"},
{txtV2Max, "/root/TestPoint2/Voltage/Max"},
};
}
private void readXmlFile()
{
this._doc.Load(szXmlFilePath);
foreach (var entry in this._arrXmlT)
{
XmlNode node = this._doc.SelectSingleNode(entry.Value);
if (null != node)
{
entry.Key.Text = node.InnerText;
}
}
}
private void writeXmlFile()
{
this._doc.Load(szXmlFilePath);
foreach (var entry in this._arrXmlT)
{
XmlNode node = this._doc.SelectSingleNode(entry.Value);
if (null != node)
{
node.InnerText = entry.Key.Text;
}
}
this._doc.Save(szXmlFilePath);
}
private void btnRead_Click(object sender, EventArgs e)
{
readXmlFile();
}
private void btnWrite_Click(object sender, EventArgs e)
{
writeXmlFile();
}
private void btnClear_Click(object sender, EventArgs e)
{
foreach (Control control in this.Controls)
{
if (control is TextBox textBox)
{
textBox.Clear();
}
}
}
}
```
---
### .json file
---



```C#=
internal class jsonFile
{
public class Impedance
{
public double Min { get; set; }
public double Max { get; set; }
}
public class Voltage
{
public double Min { get; set; }
public double Max { get; set; }
}
public class Current
{
public double Min { get; set; }
public double Max { get; set; }
}
public class Power
{
public double Min { get; set; }
public double Max { get; set; }
}
public class TestPoint1
{
public Impedance Impedance { get; set; }
public Voltage Voltage { get; set; }
public Current Current { get; set; }
public Power Power { get; set; }
}
public class TestPoint2
{
public Impedance Impedance { get; set; }
public Voltage Voltage { get; set; }
}
public class Root
{
public TestPoint1 TestPoint1 { get; set; }
public TestPoint2 TestPoint2 { get; set; }
}
}
```

```C#=
public partial class Form1 : Form
{
string szJsonFilePath = "Data/data.json";
private jsonFile.Root _data;
private Dictionary<TextBox, (Func<double> getter, Action<double> setter)> _arrJsonT;
public Form1()
{
InitializeComponent();
initTable();
readJsonFile();
}
private void initTable()
{
this._arrJsonT = new Dictionary<TextBox, (Func<double> getter, Action<double> setter)>
{
{txtR1Min, (() => _data.TestPoint1.Impedance.Min, value => _data.TestPoint1.Impedance.Min = value) },
{txtR1Max, (() => _data.TestPoint1.Impedance.Max, value => _data.TestPoint1.Impedance.Max = value) },
{txtV1Min, (() => _data.TestPoint1.Voltage.Min, value => _data.TestPoint1.Voltage.Min = value) },
{txtV1Max, (() => _data.TestPoint1.Voltage.Max, value => _data.TestPoint1.Voltage.Max = value) },
{txtI1Min, (() => _data.TestPoint1.Current.Min, value => _data.TestPoint1.Current.Min = value) },
{txtI1Max, (() => _data.TestPoint1.Current.Max, value => _data.TestPoint1.Current.Max = value) },
{txtP1Min, (() => _data.TestPoint1.Power.Min, value => _data.TestPoint1.Power.Min = value) },
{txtP1Max, (() => _data.TestPoint1.Power.Max, value => _data.TestPoint1.Power.Max = value) },
{txtR2Min, (() => _data.TestPoint2.Impedance.Min, value => _data.TestPoint2.Impedance.Min = value) },
{txtR2Max, (() => _data.TestPoint2.Impedance.Max, value => _data.TestPoint2.Impedance.Max = value) },
{txtV2Min, (() => _data.TestPoint2.Voltage.Min, value => _data.TestPoint2.Voltage.Min = value) },
{txtV2Max, (() => _data.TestPoint2.Voltage.Max, value => _data.TestPoint2.Voltage.Max = value) },
};
}
private void textChanged(object sender, EventArgs e)
{
if (sender is TextBox textBox && _arrJsonT.TryGetValue(textBox, out var binding))
{
if (double.TryParse(textBox.Text, out double newValue))
{
// Update the corresponding JSON property
binding.setter(newValue);
}
}
}
private void readJsonFile()
{
string jsonString = File.ReadAllText(this.szJsonFilePath);
this._data = JsonSerializer.Deserialize<jsonFile.Root>(jsonString);
foreach (var textBox in this._arrJsonT.Keys)
{
textBox.Text = this._arrJsonT[textBox].getter().ToString();
textBox.TextChanged += textChanged;
}
}
private void writeJsonFile()
{
var option = new JsonSerializerOptions { WriteIndented = true };
string szJsonStr = JsonSerializer.Serialize(this._data, option);
File.WriteAllText(this.szJsonFilePath, szJsonStr);
}
private void btnRead_Click(object sender, EventArgs e)
{
readJsonFile();
}
private void btnWrite_Click(object sender, EventArgs e)
{
writeJsonFile();
}
private void btnClear_Click(object sender, EventArgs e)
{
foreach (Control control in this.Controls)
{
if (control is TextBox textBox)
{
textBox.Clear();
}
}
}
}
```
---
### Youtube videio
---
{%youtube 84UsqbVp_5M %}