web-dev-qa-db-ja.com

テキストファイルの特定の位置に新しい行を追加します。

ファイルに特定のテキスト行を追加しようとしています。特に2つの境界の間。

Item1の境界の間に線を追加したい場合の例:

[item1]
2550 coins 995 200000 7
2550 coins 995 200000 7
2550 coins 995 200000 7
2550 coins 995 200000 7
2550 coins 995 200000 7
//Add a line here in between the specific boundaries
[/item1]
[item2]
2550 coins 995 200000 7
2550 coins 995 200000 7
2550 coins 995 200000 8
2550 coins 995 200000 7
2550 coins 995 200000 7
[/item2]
[item3]
2550 coins 995 200000 7
2550 coins 995 200000 7
2550 coins 995 200000 7
2550 coins 995 200000 7
2550 coins 995 200000 7
[/item3]

これは私がこれまでに試みたものですが、それはどこにも正しくありません。それは私がそれを働かせたときにそれがドキュメント全体をクリアしたときにそれがライターによって編集されないようにリーダーによってファイルが使用されていると言い続けています。

public void createEntry(String npcName)
{
    String line;
    String fileName = "Drops.de";
    StreamWriter streamWriter = new StreamWriter(fileName);
    StreamReader streamReader = new StreamReader(fileName);
    line = streamReader.ReadLine();
    if (line == ("[" + npcName + "]"))
    {
        streamReader.ReadLine();
        streamWriter.WriteLine("Test");
    }
}

文書の最後に行を書く方法も知りたいです。

11
Simon Taylor

これにより、必要な場所に行が追加されます。 (using System.IO;およびusing System.Linq;追加)

public void CreateEntry(string npcName) //npcName = "item1"
{
    var fileName = "test.txt";
    var endTag = String.Format("[/{0}]", npcName);
    var lineToAdd = "//Add a line here in between the specific boundaries";

    var txtLines = File.ReadAllLines(fileName).ToList();   //Fill a list with the lines from the txt file.
    txtLines.Insert(txtLines.IndexOf(endTag), lineToAdd);  //Insert the line you want to add last under the tag 'item1'.
    File.WriteAllLines(fileName, txtLines);                //Add the lines including the new one.
}
17
Hjalmar Z

ファイルを2度開いてはいけません。これを試してください:

FileStream fileStream = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None);
StreamWriter streamWriter = new StreamWriter(fileStream);
StreamReader streamReader = new StreamReader(fileStream);

別の考えは、行を挿入するためのロジックです。おそらくより簡単な方法は、データを行ごとに新しいファイルにコピーし、必要に応じて新しい部分を挿入して続行することです。またはメモリでそれを行います。

行を最後に追加するには、FileMode.Appendを使用するか、独自のシークを実行します

2
Viliam

この方法を試してください

using System.IO;
using System.Linq;

    /// <summary>
    /// Add a new line at a specific position in a simple file        
    /// </summary>
    /// <param name="fileName">Complete file path</param>
    /// <param name="lineToSearch">Line to search in the file (first occurrence)</param>
    /// <param name="lineToAdd">Line to be added</param>
    /// <param name="aboveBelow">insert above(false) or below(true) of the search line. Default: above </param>
    internal static void insertLineToSimpleFile(string fileName, string lineToSearch, string lineToAdd, bool aboveBelow = false)
    {          
        var txtLines = File.ReadAllLines(fileName).ToList();
        int index = aboveBelow?txtLines.IndexOf(lineToSearch)+1: txtLines.IndexOf(lineToSearch);
        if (index > 0)
        {
            txtLines.Insert(index, lineToAdd);
            File.WriteAllLines(fileName, txtLines);
        }
    }
0
Xtian11