Operacje na plikach

W tej części zostaną opisane podstawowe operacje na plikach. Za operacje na plikach odpowiedzialna jest biblioteka System.IO. Zawiera ona klasy, metody oraz właściwości niezbędne do operacji plikowych. Zawsze, gdy chcesz wykonywać operacje na plikach musisz zaimportować tę bibliotekę na początku poprzez using.Klasy biblioteki System.IO to:
BinaryReader oraz BinaryWriter, Directory, File, DirectoryInfo oraz FileInfo, FileStream, MemoryStream, StreamWriter oraz StreamReader, StringReader i StringWriter.

Zajmijmy się najpierw najprostszym przykładem uzyskiwania informacji o folderach i plikach. Informacje o folderach uzyskujemy poprzez klasę DirectoryInfo, natomiast dostęp do informacji o plikach uzyskamy, wykorzystując klasę FileInfo. Jako przykład wykorzystania tych dwóch klas, napiszemy prosty przykład, który będzie wyświetlał informacje o katalogu systemowym Windows oraz pliku Explorer.exe wewnątrz tego katalogu. Oczywiście możesz zmienić nazwę badanego katalogu oraz pliku. Wybrałem ten katalog oraz plik do testowania, gdyż znajduje się niema w każdym systemie z rodziny Windows. Wyjątkiem są systemy Windows 2000 oraz NT, gdzie systemowym katalogiem jest C:WINNT.

Utwórz teraz nowy projekt Ctrl+Shift+N i jako typ projektu wybierz Aplikacja konsolowa oraz  wpisz dowolną jego nazwę. Poniżej znajduje się listing funkcji Main. Należy pamiętać, by w sekcji using dopisać: using System.IO;

static void Main(string[] args)
        {
            string nazwa_katalogu = @"C:WINDOWS";
            string nazwa_pliku = "explorer.exe";

            DirectoryInfo katalog = new DirectoryInfo(nazwa_katalogu);

            if (katalog.Exists)
            {
     Console.WriteLine("Program wyświetla informacje o katalogach.");
     Console.WriteLine("Pełna nazwa : {0}", katalog.FullName);
     Console.WriteLine("Atrybuty : {0}", katalog.Attributes.ToString());
     Console.WriteLine("Utworzono : {0}", katalog.CreationTime);
     Console.WriteLine("Katalog : {0}", (katalog.Exists ? "istnieje" : "nie istnieje"));

                Console.WriteLine("n-- Informacje o plikach --");
                FileInfo[] pliki = katalog.GetFiles("*.*");
                Console.WriteLine("Wszystkich plików w katalogu : {0}", pliki.Length);

                FileInfo plik = new FileInfo(nazwa_katalogu + "\" + nazwa_pliku);
                if (plik.Exists)
                {
                Console.WriteLine("n-- Teraz informacje o pliku --");
                Console.WriteLine("Nazwa pliku : {0}", plik.Name);
                 Console.WriteLine("Rozszerzenie pliku : {0}", plik.Extension);
                 Console.WriteLine("Rozmiar pliku : {0}{1}", plik.Length, " bajtów");
                 Console.WriteLine("Czas utworzenia : {0:D}", plik.CreationTime.Date);
                 Console.WriteLine("Atrybuty pliku : {0}", plik.Attributes.ToString());
                }
            }
            Console.ReadKey();
            }
Uruchom powyższy przykład klawiszem F5. Spróbuj zmienić nazwę katalogu oraz pliku na inny. W programie zastosowano zabezpieczenie, które najpierw sprawdza najpierw, czy podany foler fizycznie istnieje. Jeśli tak, wyświetla na jego temat informacje. Po wyświetleniu informacji na temat folderu, program sprawdza, czy znajduje się w nim podany plik. Jeśli tak, wyświetla informacje o pliku. Zabezpieczenie takie jest niezbędne, gdyż w przypadku podania nieistniejącego foldera lub pliku, system wygeneruje błąd.

Pewną ciekawostką jest wykorzystanie nawiasów klamrowych w funkcji WriteLine do podawania parametrów:

Console.WriteLine("Nazwa pliku : {0}", plik.Name);

Oczywiście linie można zastąpić poprzez:

Console.WriteLine("Nazwa pliku : " + plik.Name);

Jednak pierwsza metoda pozwala na dodatkowe formatowanie parametrów otrzymach z klasy FIleInfo oraz DirectoryInfo. Cyfra w nawiasie klamrowym oznacza wyświetlany parametr liczony właśnie od zera. Analogicznie kolejne parametry będą zliczane poprzez kolejne liczby.  Zwróć uwagę na linię, w której pobieramy datę utworzenia:

Console.WriteLine("Czas utworzenia : {0:D}", plik.CreationTime.Date);

Format {0:D} oznacza, że data będzie sformatowana w estetyczny sposób. Aby przekonać się o zaletach formatowania, usuń znak :D, pozostawiając jedynie cyfrę 0. Zobaczysz, że różnica w działaniu będzie znaczna.

W linii wyświetlającej rozmiar pliku, dla przykładu wykorzystujemy wyświetlanie dwóch parametrów. Pierwszym jest rozmiar pliku, drugim zaś słowo – bajtów. Jest to typowy przykład, jak radzić sobie z wyświetlaniem parametrów na konsoli.

Console.WriteLine("Rozmiar pliku : {0}{1}", plik.Length, " bajtów");

Krótkiego wyjaśnienia wymaga również linia wyświetlająca fizyczne istnienie folderu.

Console.WriteLine("Katalog : {0}", (katalog.Exists ? "istnieje":"nie istnieje"));

Zastosowanie po prostu zwracania Exists w sposób:

Console.WriteLine("Katalog : {0}", katalog.Exists);

Spowoduje wyświetlenie na ekranie słowa True lub False. Natomiast sprytna sztuczka, która  operuje jedynie na typach logicznych pełni rodzaj tłumacza, zwracając odpowienio isnieje – jeśli True, oraz nie istnieje – jeśli False.

Składnia polecenia jest następująca: (warunek_logiczny ? jeśli_tak : jeśli_nie)

Operacje na folderach i plikach

Nauczymy się jak tworzyć foldery oraz pliki, jak je usuwać usuwać oraz poćwiczymy także  zapis do plików. Do tworzenia nowych katalogów wykorzystamy bibliotekę System.IO oraz znaną już nam klasę DirectoryInfo oraz FileInfo. Najpierw zajmijmy się programowym tworzeniem plików i folderów. Wykorzystamy w tym celu metody Create() i CreateSubdirectory() dla folderów oraz Create(), dla plików. Jako że najprościej jest operować na plikach tekstowych, poeksperymentujemy także zapisująć oraz odczytując tekst z dowolnie utworzonego pliku.

Aby utworzyć na dysku nowy folder, należy przede wszystkim zadeklarować bibliotekę System.IO w kodzie programu. Poniżej przedstawiam prosty przykład tworzenia foldeu i podfolderu. Dodatkowo kod wykorzystuje przechwytywanie błędów (try catch) w przypadku, gdyby z jakiegoś powodu operacja nie powiodła się. Wówczas, zamiast zawieszenia się programu, program wyświetli treść błędu.

DirectoryInfo katalog = new DirectoryInfo(@"C:GACEK");
   try
    {
     katalog.Create();
     katalog.CreateSubdirectory(@"Podkatalog");
     katalog.CreateSubdirectory(@"Podkatalognastepnyi jeszcze jeden");
    }
catch (IOException gdy_blad)
 {
  Console.WriteLine("Błąd podczas operacji: {0} ", gdy_blad.Message);                               
 }
  Console.WriteLine("nNaciśnij Enter, aby zakończyć.");
  Console.ReadLine();
 }

W przypadku napotkania błędu podczas wykonywania instrukcji zawartych w nawiasach klamrowych, w sekcji try {},  program przejdzie do obsługi błędu catch{}.

Stosowanie przechwytywania błędów jest w języku C# proste i gorąco zalecam wykorzystywanie tego mechanizmu wszędzie tam, gdzie istnieje możliwość niepowodzenia operacji. Komentarza wymaga metoda CreateSubdirectory. Jako parametr podajemy tutaj nazwę podkatalogu, nie zaś ścieżkę do niego. Dzieje się tak, ponieważ katalog nadrzędy jest zdefiniowany i jest nim zmienna katalog. Tworzenie podkatalogów można zagnieżdżać.

Tworzenie, zapis i odczyt pliku tekstowego

Spróbujmy teraz utworzyć plik tekstowy. Za chwilę się przekonasz, że jest to równie proste jak tworzenie katalogów. Jako przykład utworzymy sobie plik, do którego zapiszemy kilka linijek tekstu.

FileInfo nasz_plik = new FileInfo(@"C:GACEKPliczek.txt");
FileStream strumien = nasz_plik.Create();
FileStream plik=new FileStream("plik.txt",FileMode.OpenOrCreate, FileAccess.Write);
          
// Tworzymy strumień do zapisu pliku
StreamWriter uchwyt = new StreamWriter(file);

// Zapisujemy do pliku
uchwyt.Write("Ten tekst zostanie zapisany do pliku ");
uchwyt.Write("A to jest druga linia...");

// Zamykamy strumień
uchwyt.Close();
// ..oraz plik
plik.Close();

Zakończyliśmy zapis do pliku tekstowego. W tym miejscu musimy zatrzymać się na chwilę, aby omówić typy otwarcia pliku oraz dostępu do niego. Przyjrzyjmy się bliżej linii:

FileStream plik=new FileStream("plik.txt",FileMode.OpenOrCreate, FileAccess.Write);

FileMode to tryb otwarcia pliku. Poniższa tabela przedstawia możliwe wartości.

Tryb Opis
Append Otwiera plik w trybie dopisywania.
Create Tworzy nowy plik. Jeśli plik już istnieje, jest nadpisywany.
CreateNew Tworzy nowy plik. Jeśli plik istnieje, wywoływany jest wyjątek.
Open Otwiera istniejący plik.
OpenOrCreate Otwiera, lub tworzy nowy plik gdy nie istnieje.
Truncate Przycina istniejący plik.

FileAccess – tryb dostępu do pliku.

Tryb Opis
Read Otwiera plik w trybie tylko do odczytu.
ReadWrite Otwiera plik w trybie do odczytu oraz zapisu.
Write Otwiera plik w trybie tylko do zapisu.

Teraz, gdy już zapisałeś tekst do pliku, możesz przekonać się o tym otwierając plik np. w notatniku. Kolejnym krokiem jest dokonanie odczytu pliku z utworzonego programu. Plik można odczytać linia po linii, jak w przykładzie poniżej:

 // odczyt z pliku i wyświetlenie linia po linii
 StreamReader uchwyt = File.OpenText(@"C:GACEKPliczek.txt");
 string linia = null;

   while ((linia = uchwyt.ReadLine()) != null)
        {
          Console.WriteLine(linia);
        }
   uchwyt.Close();

Powyższy program odczytuje plik tekstowy linia po linii i wyświetla na ekranie każdą linię pliku tekstowego. Odczyt trwa dopóki nie zostanie osiągnięty koniec pliku, czyli zmienna linia nie osiągnie pustej wartości null.

FileStream plik = new FileStream("test.txt",FileMode.OpenOrCreate,FileAccess.Read);

// Tworzymy strumień do odczytu pliku
StreamReader strumien = new StreamReader(file);

// Odczytujemy zawartość całego pliku do zmiennej
string tekst = strumien.ReadToEnd();

// Zamykamy strumień
strumien.Close();

// … oraz plik
plik.Close();

W zmiennej tekst znajduje się zawartość całego pliku tekstowego i można wyświetlić jej zawartość przy użyciu standardowej metody WriteLine(). W zależności od potrzeby, można zamiennie korzystać z obu metod odczytu pliku.

756total visits,1visits today

Tagi , .Dodaj do zakładek Link.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

2 + 3 =

This site uses Akismet to reduce spam. Learn how your comment data is processed.