2016-05-05 10 views
1

複数のセクションからなるINIファイルと "Path"という名前の単一のキーがあります。 INIのすべてが、ファイルの内容を操作するために、LoadのDataGridViewにロードされます。C#:INIからセクションとそのキーを削除する最も簡単な方法

INI Example: 
[First Entry] 
Path=C:\test1.txt 
[Second Entry] 
Path=C:\test2.txt 
[Third Entry] 
Path=C:\test3.text 

ファイル全体を消去しない[Second Entry]を削除する最も簡単な方法は何でしょうか?それを介して自分自身を行くのは

INI Class: 
[DllImport("kernel32")] 
private static extern long WritePrivateProfileString(string section, string key, string val, string fileName); 

public void Write(string section, string key, string value) 
{ 
WritePrivateProfileString(section, key, value.ToLower(), path); 
} 

Form Button: 
private void WriteINI() 
{ 
myINI.Write(txtName.Text, "Path", txtPath.Text); 
ReadINI(); 
} 
+0

簡単にC#に変換する:http://stackoverflow.com/a/31671066/3740093 –

+0

データ構造にロードし、保持したいフィールドだけを書き戻します。 – Krythic

+0

ライブラリを使用してiniファイルを処理することを検討しましたか?私は1つを作成しました:https://github.com/rickyah/ini-parser(NuGetと一緒にインストール可能) –

答えて

2

メソッドにlpKeyNameため、このようにNULL値を渡すことによって、セクション全体を削除することができWritePrivateProfileStringメソッドを使用:

[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
public static extern bool WritePrivateProfileString(
     string lpAppName, string lpKeyName, string lpString,string lpFileName); 

private void button1_Click(object sender, EventArgs e) 
{ 
    WritePrivateProfileString("Second Entry", null, null, @"d:\test.ini"); 
} 

lpKeyName
キーの名前は、文字列に関連付けられます。 キーが指定されたセクションに存在しない場合、キーが作成されます。 このパラメータがNULLの場合、セクション内のすべてのエントリ を含むセクション全体が削除されます。

1

方法:ここで

は、私は、ファイルに新しい情報を書き込むため、現時点ではと働いている何ですか?これらの行の何か:

private static void RemoveSectionFromIniFile(string file, string section) 
{ 
    using (var reader = File.OpenText(file)) 
    { 
     using (var writer = File.CreateText(file + ".tmp")) 
     { 
      var i = false; 
      while (reader.Peek() != -1) 
      { 
       var line = reader.ReadLine(); 
       if (!string.IsNullOrWhiteSpace(line)) 
       { 
        if (line.StartsWith("[") && line.EndsWith("]")) 
        { 
         if (i) i = false; 
         else if (line.Substring(1, line.Length - 2).Trim() == section) i = true; 
        } 
       } 
       if (!i) writer.WriteLine(line); 
      } 
     } 
    } 
    File.Delete(file); 
    File.Move(file + ".tmp", file); 
} 

例外処理とフォーマット処理は行われませんが、そのジョブは実行されます。

+0

このようなテキスト処理を避ける方が良いですが、ヌルを渡して 'WritePrivateProfileString'を使ってセクション全体を単純に削除することができます'lpKeyName'パラメータに設定します。 –

関連する問題