2013-04-25 18 views
8

Próbuję dodać określoną linię tekstu do pliku. W szczególności między dwiema granicami.Dodaj nową linię w określonej pozycji w pliku tekstowym.

Przykładem tego, co to będzie wyglądać, jeśli chciałem dodać linię pomiędzy granicami 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] 

To, co starałem tak daleko, jednak jej nigdzie w pobliżu poprawne. Ciągle mówi, że plik jest używany przez czytnik, więc nie może być edytowany przez autora, kiedy go uruchomiłem, wyczyścił cały dokument.

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"); 
    } 
} 

Chciałbym również wiedzieć, jak pisać wiersze na końcu dokumentu.

+0

Czytaj plik tak jak w poprzednim pytaniu i zapis do nowego pliku podczas dodawania nowych wierszy. – I4V

+0

Dodałem, co próbowałem, myślę, że jest bardzo daleko od tej pory –

Odpowiedz

13

Spowoduje to dodanie wiersza, w którym chcesz go. (Upewnij się, że using System.IO; dodana)

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. 
} 
+0

Dzięki za to, jedynym problemem jest to, że ciągle mówi mi, że plik jest w użyciu, w "using (File.Create (fileName)) { } " –

+0

Dziwne, działa dla mnie dobrze. Czy masz inny kod, który korzysta z pliku? Nie potrzebujesz żadnego 'FileStream',' StreamWriter' lub 'StreamReader' aby to działało. –

+0

Ah, przepraszam. Jedna z moich innych metod wpłynęła na twoją. W każdym razie wydaje się, że działa świetnie w tej chwili, dzięki :) –

2

Nie należy otworzyć plik dwukrotnie, spróbuj tego:

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

kolejnym zdaniem jest logika do wstawiania linii, może łatwiej sposobem jest skopiowanie linii danych po linii do nowego pliku, wstawić nową część, gdy są potrzebne i dalej. Lub zrób to w pamięci.

Aby dodać linię do końca można wykorzystać FileMode.Append lub zrobić własne poszukiwania

0

spróbować tej metody

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); 
     } 
    } 
Powiązane problemy