Добавление строки в середину файла с помощью .NET

Здравствуйте, я над чем-то работаю, и мне нужно иметь возможность добавлять текст в файл .txt. Хотя у меня это завершено, у меня есть небольшая проблема. Мне нужно написать строку в середине файла более или менее. Пример:

Hello my name is Brandon,
I hope someone can help, //I want the string under this line.
Thank you.

Надеюсь, кто-нибудь поможет с решением.

Редактировать Хорошо, спасибо, ребята, я попробую разобраться, возможно, просто перепишу весь файл. Хорошо, программа, которую я делаю, связана с файлом hosts, и не у всех есть один и тот же файл hosts, поэтому мне было интересно, есть ли способ прочитать их файл hosts и скопировать его весь, добавляя к нему строку ?


person Brandon    schedule 11.01.2010    source источник
comment
Знаете ли вы, что StreamWriter является частью .NET, а не частью языка программирования C#?   -  person John Saunders    schedule 11.01.2010


Ответы (6)


С обычными файлами это невозможно: вы должны прочитать текст, следующий за строкой, которую вы хотите добавить, перезаписать файл, а затем добавить исходный конечный текст.

Думайте о файлах на диске как о массивах — если вы хотите вставить некоторые элементы в середину массива, вам нужно сдвинуть все следующие элементы вниз, чтобы освободить место. Разница в том, что .NET предлагает удобные методы для массивов и Lists, которые упрощают эту задачу. Насколько мне известно, API-интерфейсы файлового ввода-вывода не предлагают таких удобных методов.

Когда вы заранее знаете, что вам нужно вставить в середину файла, часто бывает проще просто написать новый файл с измененным содержимым, а затем выполнить переименование. Если файл достаточно мал для чтения в память, это можно легко сделать с помощью некоторого LINQ:

var allLines = File.ReadAllLines( filename ).ToList();
allLines.Insert( insertPos, "This is a new line..." );
File.WriteAllLines( filename, allLines.ToArray() );
person LBushkin    schedule 11.01.2010

Это лучший способ вставить текст в середине текстового файла.

 string[] full_file = File.ReadAllLines("test.txt");
 List<string> l = new List<string>();
 l.AddRange(full_file);
 l.Insert(20, "Inserted String"); 
 File.WriteAllLines("test.txt", l.ToArray());
person Rajesh    schedule 31.08.2012
comment
Этот метод не самый лучший. К концу есть 3 структуры данных с каждой строкой текста и есть вставка в середине списка. Он не эффективен и поэтому его нельзя назвать лучшим. - person Ronnie Overby; 04.05.2020

Проверьте File.ReadAllLines(). Наверное, самый простой способ.

     string[] full_file = File.ReadAllLines("test.txt");
     List<string> l = new List<string>();
     l.AddRange(full_file);
     l.Insert(20, "Inserted String");
     File.WriteAllLines("test.txt", l.ToArray());
person SwDevMan81    schedule 11.01.2010

один из трюков - файловая транзакция. сначала вы читаете файл до строки, в которую хотите добавить текст, но во время чтения продолжайте сохранять прочитанные строки в отдельном файле, например, tmp.txt, а затем добавляете нужный текст в tmp.txt (в конце файла) после этого продолжить чтение с исходного файла до конца. затем замените tmp.txt исходным файлом. в конце у вас есть файл с добавленным текстом в середине :)

person ramtinova    schedule 11.01.2010

Если вы знаете индекс строки, используйте readLine, пока не дойдете до этой строки и не напишите под ней. Если вы точно знаете текст этой строки, сделайте то же самое, но сравните текст, возвращенный из readLine, с текстом, который вы ищете, а затем напишите под этой строкой.

Или вы можете искать индекс указанной строки и писать после него, используя управляющую последовательность \n.

person GxG    schedule 11.01.2010

Как уже упоминалось, нет возможности переписать файл после точки вновь вставленного текста, если вы должны придерживаться простого текстового файла. Однако, в зависимости от ваших требований, можно ускорить поиск местоположения, чтобы начать писать. Если бы вы знали, что вам нужно добавить данные после строки N, то вы могли бы вести отдельный «указатель» смещений номеров строк. Это позволит вам перейти непосредственно в нужное место, чтобы начать чтение/запись.

person Mark Wilkins    schedule 11.01.2010