TOC

This article is currently in the process of being translated into Polish (~48% done).

File handling:

Reading and writing files

W tym rozdziale będziemy się skupiać na prostym odczytywaniu i zapisywaniu do plików w C#. Na szczęście C# ułatwia nam te operacje dzięki klasie File z przestrzeni nazw System.IO, która zawiera wszelkie potrzebne elementy do zapisywania i odczytywania do pliku.

W naszym pierwszym przykładzie stworzymy najprostszy z możliwych edytorów tekstu. Będzie on tak prosty że będziemy mogli tylko odczytać plik i dopisać do niego nową zawartość, co ważne będziemy mogli zapisywać tylko jedną linijkę tekstu na raz. Mimo tych ograniczeń zobaczysz jak łatwa w użyciu jest klasa 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);
        }
    }
}

Zauważ że używamy klasy File w trzech miejscach: używamy jej do sprawdzenia czy plik istnieje, używamy metody ReadAllText() do odczytania zawartości pliku i na koniec używamy metody WriteAllText() do zapisania nowej wartości do pliku. Zauważysz również że nie używamy ścieżek absolutnych do pliku lecz po prostu nazwy pliku. Dzięki temu nasz plik tekstowy zostanie umiejscowiony w tym samym folderze co nasz plik wykonywalny, co na chwilę obecną jest nam na rękę. Koniec końców ten przykład powinien być łatwy do zrozumienia: sprawdzamy czy plik istnieje, odczytujemy jego zawartość następnie wyświetlamy ją w konsoli. Następnie prosimy użytkownika o wpisanie nowego tekstu, który potem zapisujemy do pliku. Oczywiście wprowadzony przez użytkownika tekst nadpisze dotychczasową zawartość pliku, lecz na potrzeby tej lekcji jest to akceptowalne. Moglibyśmy też użyć metody AppendAllText() zamiast WriteAllText(). Dokonaj stosownych zmian w kodzie źródłowym na poniższe:

File.AppendAllText("test.txt", newContent);

If you run it, you will see that the new text is added to the existing text instead of overwriting it. As simple as that. But we still get only one line of text per execution of our application. Let's be a bit creative and change that. Replace the last lines in our example with this:

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

As you can see, we instruct the user to enter the word exit when they wish to stop editing the file, and until they do just that, we append the user input to the file and then prompt for a new line. We also append a newline character, the Environment.NewLine, to make it look like actual lines of text.

However, instead of writing to the file each time, a more pretty solution would probably look something like this:

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

The usage of Streams is a bit out of the scope of this chapter, but the cool thing about it in this example is that we only open the file once, and then write the changes to it once we're satisfied. In this case, we're taking advantage of the using() statement of C#, which ensures that the file reference is closed once it goes out of scope, which is when it's block of { } is done. If you don't use the using() statement, you will have to manually call the Close() method on the StreamWriter instance.


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!