第一種方法:
/**
*┌──────────────────────────────────────────────────────────────┐
*│ 描 述:日志相關的工具類
*│ 作 者:執筆小白
*│ 版 本:1.0
*│ 創建時間:2020-6-13 15:40:56
*└──────────────────────────────────────────────────────────────┘
*┌──────────────────────────────────────────────────────────────┐
*│ 命名空間: ZhibiXiaobai.Uril.ConfigFileHelper
*│ 類 名:OperateFile_InI
*└──────────────────────────────────────────────────────────────┘
*/
using System.Runtime.InteropServices;
using System.Text;
namespace ZhibiXiaobai.Uril.ConfigFileHelper
{
/// <summary>
/// InI文件的讀寫
/// </summary>
public class OperateFile_InI
{
#region API函數聲明
/// <summary>
/// 讀-獲取所有節點名稱(Section)
/// </summary>
/// <param name="lpszReturnBuffer">存放節點名稱的內存地址,每個節點之間用\0分隔</param>
/// <param name="nSize">內存大小(characters)</param>
/// <param name="lpFileName">Ini文件</param>
/// <returns>內容的實際長度,為0表示沒有內容,為nSize-2表示內存大小不夠</returns>
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
private static extern uint GetPrivateProfileSectionNames(IntPtr lpszReturnBuffer, uint nSize, string lpFileName);
/// <summary>
/// 讀-獲取某個指定節點(Section)中所有KEY和Value
/// </summary>
/// <param name="lpAppName">節點名稱</param>
/// <param name="lpReturnedString">返回值的內存地址,每個之間用\0分隔</param>
/// <param name="nSize">內存大小(characters)</param>
/// <param name="lpFileName">Ini文件</param>
/// <returns>內容的實際長度,為0表示沒有內容,為nSize-2表示內存大小不夠</returns>
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
private static extern uint GetPrivateProfileSection(string lpAppName, IntPtr lpReturnedString, uint nSize, string lpFileName);
/// <summary>
/// 寫-將指定的鍵值對寫到指定的節點,如果已經存在則替換。
/// </summary>
/// <param name="lpAppName">節點,如果不存在此節點,則創建此節點</param>
/// <param name="lpString">Item鍵值對,多個用\0分隔,形如key1=value1\0key2=value2
/// <para>如果為string.Empty,則刪除指定節點下的所有內容,保留節點</para>
/// <para>如果為null,則刪除指定節點下的所有內容,並且刪除該節點</para>
/// </param>
/// <param name="lpFileName">INI文件</param>
/// <returns>是否成功寫入</returns>
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
[return: MarshalAs(UnmanagedType.Bool)] //可以沒有此行
private static extern bool WritePrivateProfileSection(string lpAppName, string lpString, string lpFileName);
/// <summary>
/// 寫-寫標簽值
/// </summary>
/// <param name="section">節點</param>
/// <param name="key">Key</param>
/// <param name="val"></param>
/// <param name="filePath">Ini文件</param>
/// <returns></returns>
[DllImport("kernel32", EntryPoint = "WritePrivateProfileString")] // 返回0表示失敗,非0為成功
private static extern long WritePrivateProfileString(string section, string key,
string val, string filePath);
/// <summary>
/// 讀-讀標簽值
/// </summary>
/// <param name="section"></param>
/// <param name="key"></param>
/// <param name="def"></param>
/// <param name="retVal"></param>
/// <param name="size">內存大小</param>
/// <param name="filePath">Ini文件</param>
/// <returns></returns>
[DllImport("kernel32", EntryPoint = "GetPrivateProfileString")] // 返回取得字符串緩沖區的長度
private static extern long GetPrivateProfileString(string section, string key,
string def, StringBuilder retVal, int size, string filePath);
#endregion API函數聲明
#region 讀Ini文件
/// <summary>
/// 讀Ini文件-標簽值
/// 詳細見INI例子
/// </summary>
/// <param name="Section">[Section]標簽的名字</param>
/// <param name="Key">key</param>
/// <param name="NoText">未找到值時默認返回的值</param>
/// <param name="iniFilePath">ini文件的路徑</param>
/// <returns></returns>
public static string ReadIniData(string Section, string Key, string NoText, string iniFilePath)
{
if (File.Exists(iniFilePath))
{
StringBuilder temp = new StringBuilder(1024);
GetPrivateProfileString(Section, Key, NoText, temp, 1024, iniFilePath);
return temp.ToString();
}
else
{
return String.Empty;
}
}
/// <summary>
/// 讀取INI文件中指定INI文件中的所有節點名稱(Section)-未測試多線程使用
/// 最多32767個char
/// </summary>
/// <param name="iniFile">Ini文件</param>
/// <returns>所有節點,沒有內容返回string[0]</returns>
public static string[] INIGetAllSectionNames(string iniFile)
{
uint MAX_BUFFER = 32767; //默認為32767
string[] sections = new string[0]; //返回值
//申請內存
IntPtr pReturnedString = Marshal.AllocCoTaskMem((int)MAX_BUFFER * sizeof(char));
uint bytesReturned = GetPrivateProfileSectionNames(pReturnedString, MAX_BUFFER, iniFile);
if (bytesReturned != 0)
{
//讀取指定內存的內容
string local = Marshal.PtrToStringAuto(pReturnedString, (int)bytesReturned).ToString();
//每個節點之間用\0分隔,末尾有一個\0
sections = local.Split(new char[] { '\0' }, StringSplitOptions.RemoveEmptyEntries);
}
//釋放內存
Marshal.FreeCoTaskMem(pReturnedString);
return sections;
}
/// <summary>
/// 獲取INI文件中指定節點(Section)中的所有條目(key=value形式)-未測試多線程使用
/// 最多32767個char
/// </summary>
/// <param name="iniFile">Ini文件</param>
/// <param name="section">節點名稱</param>
/// <returns>指定節點中的所有項目,沒有內容返回string[0]</returns>
public static string[] INIGetAllItems(string iniFile, string section)
{
//返回值形式為 key=value,例如 Color=Red
uint MAX_BUFFER = 32767; //默認為32767
string[] items = new string[0]; //返回值
//分配內存
IntPtr pReturnedString = Marshal.AllocCoTaskMem((int)MAX_BUFFER * sizeof(char));
uint bytesReturned = GetPrivateProfileSection(section, pReturnedString, MAX_BUFFER, iniFile);
if (!(bytesReturned == MAX_BUFFER - 2) || (bytesReturned == 0))
{
string returnedString = Marshal.PtrToStringAuto(pReturnedString, (int)bytesReturned);
items = returnedString.Split(new char[] { '\0' }, StringSplitOptions.RemoveEmptyEntries);
}
Marshal.FreeCoTaskMem(pReturnedString); // 釋放內存
return items;
}
#endregion 讀
#region 寫Ini文件
/// <summary>
/// 寫Ini文件-標簽值
/// 詳細見INI例子
/// </summary>
/// <param name="Section">[Section]標簽的名字</param>
/// <param name="Key">key</param>
/// <param name="Value">key對應的Value</param>
/// <param name="iniFilePath">ini文件的路徑</param>
/// <returns></returns>
public static bool WriteIniData(string Section, string Key, string Value, string iniFilePath)
{
if (File.Exists(iniFilePath))
{
long OpStation = WritePrivateProfileString(Section, Key, Value, iniFilePath);
return OpStation == 0 ? false : true;
}
else
{
return false;
}
}
#endregion 寫
}
/* DBServer.ini結構如下
* [Head]
* Head=Head項不可刪除
* [Server]
* Name=localhost
* [DB]
* Name=NorthWind
* [User]
* Name=sa
*/
}
第二種方法:
微軟的Configuration Extensions來讀取ini文件。
第三種方法:
同事寫的文件流讀取的方法:
查看代碼
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
namespace BOZHON.TSAMO.Common.文件操作類
{
/// <summary>
/// 僅支持整個程序讀取單個文件,有需要可自己修改
/// </summary>
public class ReadIniFileHelper
{
private static Dictionary<string, Dictionary<string, string>> IniFileContent;
public static string message;
/// <summary>
/// 初始化讀取
/// </summary>
/// <param name="path">文件路徑</param>
public static void InitializeRead(string path)
{
IniFileContent = new Dictionary<string, Dictionary<string, string>>();
if (!File.Exists(path))
{
message = "文件路徑不存在";
return;
}
try
{
string[] lines = File.ReadAllLines(path).Select(a => a.Trim()).ToArray();
Dictionary<string, string> keyValues = null;
string key = null;
for (int i = 0; i < lines.Length; i++)
{
string item = lines[i];
if (string.IsNullOrEmpty(item))
{
continue;
}
try
{
if (item.First() == '[' && item.Last() == ']')
{
key = item.Substring(1, item.Length - 2);
keyValues = new Dictionary<string, string>();
IniFileContent.Add(key, keyValues);
}
else
{
keyValues = IniFileContent[key];
var array = item.Split('=');
keyValues.Add(array[0], array[1]);
}
}
catch
{
IniFileContent = null;
message = $"第{i + 1}行解析異常";
return;
}
}
message = null;
}
catch (Exception e)
{
IniFileContent = null;
message = e.ToString();
return;
}
}
/// <summary>
/// 指定讀取
/// </summary>
/// <param name="section"></param>
/// <returns>字典</returns>
public static Dictionary<string, string> ReadValue(string section)
{
if (string.IsNullOrEmpty(section))
{
message = "參數為空";
return null;
}
if (IniFileContent == null)
{
message = "請先執行【InitializeRead】方法";
return null;
}
if (!IniFileContent.ContainsKey(section))
{
message = "數據不存在";
return null;
}
message = null;
return IniFileContent[section];
}
/// <summary>
/// 指定讀取
/// </summary>
/// <param name="section"></param>
/// <param name="key"></param>
/// <returns>字符串</returns>
public static string ReadValue(string section, string key)
{
if (string.IsNullOrEmpty(section) || string.IsNullOrEmpty(key))
{
message = "參數為空";
return null;
}
if (IniFileContent == null)
{
message = "請先執行【InitializeRead】方法";
return null;
}
if (!IniFileContent.ContainsKey(section))
{
message = "數據不存在";
return null;
}
message = null;
return IniFileContent[section][key];
}
}
}