TOC

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.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!