This article has been localized into Russian by the community.
Чтение и запись файлов
В этой главе мы разберемся, как читать и записывать простые файлы с использованием C#. К счастью для нас, вместе с C# это делать очень легко: класс File, из пространства имен System.IO, содержит в себе практически все, что мы можем захотеть, значительно упрощая работу по чтению или записи файлов.
В нашем первом примере мы сконструируем максимально минималистичный текстовый редактор. На самом деле он настолько простой, что мы можем только прочитать один файл и записать в него новое содержимое, только по одной строке текста одновременно. На это показывает нам то, насколько просто использовать класс File:
using System;
using System.IO;
namespace FileHandlingArticleApp
{
class Program
{
static void Main(string[] args)
{
if(File.Exists("test.txt"))
{
string content = File.ReadAllText("test.txt");
Console.WriteLine("Current content of file:");
Console.WriteLine(content);
}
Console.WriteLine("Please enter new content for the file:");
string newContent = Console.ReadLine();
File.WriteAllText("test.txt", newContent);
}
}
}
Вы заметите, что мы используем класс File в трех местах: мы используем его, чтобы проверить, существует ли наш файл, мы используем метод ReadAllText () для чтения содержимого файла, и мы используем метод WriteAllText () для записи нового содержимого в файл. Вы заметите, что я не использую абсолютные пути, а просто простое имя файла. Это поместит файл в ту же директорию, что и исполняемый файл, что пока нормально. Кроме этого, пример должен быть достаточно простым для понимания: мы проверяем файл, если он существует, мы читаем его содержимое и выводим его на консоль. Затем мы запрашиваем у пользователя новый контент, и как только он у нас появляется, мы записываем его в файл. Очевидно, что это перезапишет предыдущий контент, но пока это просто отлично. Однако мы могли бы вместо этого использовать метод AppendAllText. Попробуйте вместо этого изменить строку WriteAllText:
File.AppendAllText("test.txt", newContent);
Если вы запустите программу, то вы увидите, что новый текст добавляется к уже существующему, вместо перезаписи его. Настолько просто, насколько вообще возможно. Но мы все еще можем записать только одну строку текста за одно выполнение программы. Давайте проявим немного смекалки и исправим это. Замените последние строки нашего примера этим:
Console.WriteLine("Please enter new content for the file - type exit and press enter to finish editing:");
string newContent = Console.ReadLine();
while(newContent != "exit")
{
File.AppendAllText("test.txt", newContent + Environment.NewLine);
newContent = Console.ReadLine();
}
Как можно заметить, мы инструктируем пользователя ввести слово exit, если он захочет прекратить редактирование файла, но пока он этого не сделает, мы будем дописывать введенные пользователем данные в конец файла, а затем попросим ввести еще одну строку. Для того, чтобы это выглядело как настоящие строки текста, мы дописываем символ новой строки - Environment.NewLine.
Тем не менее, вместо записи в файл каждый раз, намного более элегантное решение скорее всего будет выглядеть примерно так:
Console.WriteLine("Please enter new content for the file - type exit and press enter to finish editing:");
using(StreamWriter sw = new StreamWriter("test.txt"))
{
string newContent = Console.ReadLine();
while(newContent != "exit")
{
sw.Write(newContent + Environment.NewLine);
newContent = Console.ReadLine();
}
}
Использование Патоки немного выходит за рамки этой главы, но в этом примере круто то, что мы открываем файл только один раз, а затем записываем изменения в него, как только мы будем удовлетворены. В этом случае мы воспользуемся оператором using () C #, который гарантирует, что ссылка на файл закрывается, как только он выходит из области видимости, то есть когда выполняется блок {}. Если вы не используете оператор using (), вам придется вручную вызывать метод Close () в экземпляре StreamWriter.