Sicherung
This commit is contained in:
120
Config.Net/Stores/IniFileConfigStore.cs
Normal file
120
Config.Net/Stores/IniFileConfigStore.cs
Normal file
@@ -0,0 +1,120 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using Config.Net.Core;
|
||||
using Config.Net.Stores.Formats.Ini;
|
||||
|
||||
namespace Config.Net.Stores
|
||||
{
|
||||
/// <summary>
|
||||
/// Simple INI storage.
|
||||
/// </summary>
|
||||
class IniFileConfigStore : IConfigStore
|
||||
{
|
||||
private readonly string? _fullName;
|
||||
private readonly StructuredIniFile _iniFile;
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>r
|
||||
/// <param name="name">File does not have to exist, however it will be created as soon as you
|
||||
/// try to write to it</param>
|
||||
public IniFileConfigStore(string name, bool isFilePath, bool parseInlineComments, bool unescapeNewLines = false)
|
||||
{
|
||||
if (name == null) throw new ArgumentNullException(nameof(name));
|
||||
|
||||
if (isFilePath)
|
||||
{
|
||||
_fullName = Path.GetFullPath(name); // Allow relative path to INI file
|
||||
|
||||
string? parentDirPath = Path.GetDirectoryName(_fullName);
|
||||
if (string.IsNullOrEmpty(parentDirPath)) throw new IOException("the provided directory path is not valid");
|
||||
if (!Directory.Exists(parentDirPath))
|
||||
{
|
||||
Directory.CreateDirectory(parentDirPath);
|
||||
}
|
||||
|
||||
_iniFile = ReadIniFile(_fullName, parseInlineComments, unescapeNewLines);
|
||||
|
||||
CanWrite = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
_iniFile = ReadIniContent(name, parseInlineComments, unescapeNewLines);
|
||||
|
||||
CanWrite = false;
|
||||
}
|
||||
|
||||
CanRead = true;
|
||||
}
|
||||
|
||||
public string Name => ".ini";
|
||||
|
||||
public bool CanRead { get; }
|
||||
|
||||
public bool CanWrite { get; }
|
||||
|
||||
public string? Read(string key)
|
||||
{
|
||||
if (FlatArrays.IsArrayLength(key, k => _iniFile[k], out int length))
|
||||
{
|
||||
return length.ToString();
|
||||
}
|
||||
|
||||
if (FlatArrays.IsArrayElement(key, k => _iniFile[k], out string? element))
|
||||
{
|
||||
return element;
|
||||
}
|
||||
|
||||
return _iniFile[key];
|
||||
}
|
||||
|
||||
public void Write(string key, string? value)
|
||||
{
|
||||
if (!CanWrite) return;
|
||||
|
||||
_iniFile[key] = value;
|
||||
|
||||
WriteIniFile();
|
||||
}
|
||||
|
||||
private static StructuredIniFile ReadIniFile(string fullName, bool parseInlineComments, bool unescapeNewLines = false)
|
||||
{
|
||||
FileInfo iniFile = new FileInfo(fullName);
|
||||
if(iniFile.Exists)
|
||||
{
|
||||
using(FileStream stream = iniFile.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
|
||||
{
|
||||
return StructuredIniFile.ReadFrom(stream, parseInlineComments, unescapeNewLines);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return new StructuredIniFile();
|
||||
}
|
||||
}
|
||||
|
||||
private static StructuredIniFile ReadIniContent(string content, bool parseInlineComments, bool unescapeNewLines = false)
|
||||
{
|
||||
using (Stream input = new MemoryStream(Encoding.UTF8.GetBytes(content)))
|
||||
{
|
||||
return StructuredIniFile.ReadFrom(input, parseInlineComments, unescapeNewLines);
|
||||
}
|
||||
}
|
||||
|
||||
private void WriteIniFile()
|
||||
{
|
||||
if (_fullName == null) return;
|
||||
|
||||
using(FileStream stream = File.Create(_fullName))
|
||||
{
|
||||
_iniFile.WriteTo(stream);
|
||||
}
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
//nothing to dispose
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user