Poznáváme C# a Microsoft.NET 33. díl – I/O podruhé

Po seznámení se s principem streamů, které proběhlo v minulém díle, se dnes seznámíme s několika dalšími třídami ze jmenného prostoru System.IO. Díky těmto třídám jsme schopni například lépe pracovat s textovými soubory nebo zjišťovat informace o souborech.

Třídy TextReader a TextWriter

TextReader a TextWriter jsou abstraktní třídy, určené pro pohodlné čtení respektive zápis sekvence znaků. Každá z této dvojice abstraktních tříd má ve jmenném prostoru System.IO základní knihovny tříd .NET frameworku dva potomky. Pro třídu TextReader to jsou StringReader a StreamReader a pro třídu TextWriter to jsou analogicky třídy StringWriter a StreamWriter. StringReader a StringWriter jsou implementace TextReaderu, které čtou/zapisují z/do prostého řetězce. Na rozdíl od této dvojice StreamReader a StreamWriter jsou určeny pro čtení respektive zápis z/do datového proudu bytů.

Na třídě TextReader jsou implementovány užitečné metody ReadLine a ReadToEnd. První zmiňovaná načte jeden řádek textu ze určitého zdroje a posune pozici čtení na další řádek a metoda ReadToEnd slouží k načtení všech znaků ze zdroje a vrátí je jako souvislý řetězec. Třída TextWriter obsahuje definici metody WriteLine, která, jak již název napovídá, umí zapsat jeden řádek textu do zdroje. Následující příklad ukazuje použití StreamReaderu a StreamWriter pro práci s textovým souborem.

/// <summary>
/// Ukazka pouziti tridy StreamWriter pro zapis textu do souboru
/// </summary>
public static void ZapisPomociStreamWriteru()
{
  Stream lStream = null;
  try
  {
    lStream = new FileStream(@"C:\pokus.txt",FileMode.Create);
    TextWriter lWriter = new StreamWriter(lStream);
    lWriter.WriteLine("Prvni radek");
    lWriter.WriteLine("Druhy radek");
    lWriter.Close();
  }
  finally
  {
    lStream.Close();
  }
}

/// <summary>
/// Ukazka pouziti tridy StreamReader pro cteni textu do souboru
/// </summary>
public static void CteniPomociStreamReaderu()
{
  Stream lStream = null;
  try
  {
    lStream = new FileStream(@"C:\pokus.txt",FileMode.Open);
    TextReader lReader = new StreamReader(lStream);
    string lRadek;
    while((lRadek = lReader.ReadLine()) != null)
      Console.WriteLine(lRadek);
  }
  finally
  {
    lStream.Close();
  }
}

Práce s pamětí pomocí proudů

Stejně jako k souboru nebo síťovému připojení je možné přistupovat pomocí datových proudů i k paměti. Implementace abstraktní třídy Stream je pro tento typ úložiště představována třídou MemoryStream ze základní knihovny tříd .NET frameworku. Tuto třídu pravděpodobně nejčastěji použijete v případech, kdy potřebujete pracovat pouze s dočasnými daty, která není třeba uchovávat v nějakém persistentním úložišti. Následující jednoduchý příklad obsahuje ukázku použití datového proudu do paměti.

/// <summary>
/// Ukazka pouziti tridyMemoryStream pro praci s pameti pomoci proudu
/// </summary>
public static void PraceSMemoryStreamem()
{
  MemoryStream lStream = null;
  try
  {
    lStream = new MemoryStream();
    BinaryWriter lWriter = new BinaryWriter(lStream);
    lWriter.Write("Data zapsana proudem do pameti");
    //nastaveni pozice ve streamu na zacatek
    lStream.Position = 0;
    //precteni zapsanych dat
    BinaryReader lReader = new BinaryReader(lStream);
    Console.WriteLine(lReader.ReadString());
  }
  finally
  {
    lStream.Close();
  }
}

Třída File

Základní knihovna tříd .NET frameworku obsahuje třídu File, která obsahuje pouze statické metody, určené pro práci se soubory jako například vytváření, kopírování, mazání, přesouvání, zjištění zda soubory existují nebo jejich otevírání. Mimo tyto základní operace je možné její pomocí zjišťovat nebo i nastavovat například čas vytvoření, poslední modifikace, posledního přístupu. Také je nám umožněno číst i nastavovat atributy konkrétního souboru. Jak může vypadat použití této třídy, demonstruje tento příklad.

/// <summary>
/// Priklad ukazujici nektere moznosti tridy System.IO.File
/// </summary>
public static void FileExam()
{
  string lPath = @"C:\test.txt";
  //pokud soubor na dane ceste neexistuje vytvorime jej
  if (!File.Exists(lPath))
  {
    Stream lStream = File.Create(lPath);
    lStream.Close();
}
       StreamWriter lWriter = File.AppendText(lPath);
  lWriter.WriteLine("Radek textu");
  lWriter.Close();
  Console.WriteLine("Cas vytvoreni : {0}", File.GetCreationTime(lPath));
  //nastaveni atributu archivace
  File.SetAttributes(lPath,FileAttributes.Archive);
  Console.WriteLine("Attributy : ",File.GetAttributes(lPath));
}

Trochu si příklad rozebereme. Pomocí metody Exists zjistíme, jestli soubor na dané cestě, která je předána formálním parametrem, již existuje. V případě, že tomu tak není, využijeme metody Create, která soubor vytvoří a jako výsledek vrací odkaz na instancí třídy FileStream, pomocí něhož je možné s nově vytvořeným souborem pracovat. My tento Stream v příkladu pouze zavřeme, aby bylo možné s ním dále pracovat jinými postupy. Pokud bychom tak neučinili, tak by další příkazy skončili vyhozením výjimky.

Následuje volání metody AppendText, která vrátí odkaz na instanci StreamWriteru asociovaného s určeným souborem, jehož pomocí zapíšeme do souboru nějaký text. Další akcí je vypsání času vytvoření souboru, čehož je dosaženo použitím metody GetCreationTime. Souboru potom pomocí metody SetAttribute nastavíme atribut archivace. Jako reprezentace atributů souboru je v základní knihovně tříd .NET frameworku použit výčet (enum) FileAttributes jehož použití můžete v příkladu vidět. A na konec jsou voláním metody GetAttributes zjištěny všechny nastavené atributy souboru a vypsány.

Zdrojové soubory k ukázkovým příkladům naleznete zde.

Diskuze (7) Další článek: Petice: OS/2 jako Open Source

Témata článku: Microsoft, Software, Programování, Díl, Public, LRA, Proud, Microsoft NET, Stream, Základní knihovna, Software na Heureka.cz



Šmírování kamerami Googlu: Koukněte, co nového se zase objevilo na Street View

Šmírování kamerami Googlu: Koukněte, co nového se zase objevilo na Street View

Google stále fotí celý svět do své služby Street View. A novodobou zábavou je hledat v mapách Googlu vtipné záběry. Podívejte se na výběr nejlepších!

redakce
Mapy GoogleStreet View
16 míst na mapách Googlu a Microsoftu, které nesmíte vidět. Nahradily je čtverečky a mlha

16 míst na mapách Googlu a Microsoftu, které nesmíte vidět. Nahradily je čtverečky a mlha

** Internet se roky bavil uměle rozčtverečkovanými místy v mapách ** Postupně jich ale ubývá, nebo se jedná o běžné chyby ** Výjimkou je Evropa. Tady čtverečkujeme až až

Jakub Čížek
Mapy GoogleMapy
Vyrobte si elektřinu sami. S dobře vybranou fotovoltaikou vás nebude trápit zdražování, Rusko a vlastně ani vlastní stát

Vyrobte si elektřinu sami. S dobře vybranou fotovoltaikou vás nebude trápit zdražování, Rusko a vlastně ani vlastní stát

Zdražení se na nás valí ze všech stran a nejvíce se týká energií. Ať už je to plyn, pohonné hmoty, nebo elektřina. Z těchto tří můžete nejvíce zahýbat právě s elektřinou, a to investicí do fotovoltaické elektrárny. Podívejme se objektivním pohledem, pro koho je vhodná, a komu se naopak vůbec nevyplatí.

Jiří Kuruc
EnergetikaFotovoltaika
Jak přečíst platební kartu mobilem a k čemu je to dobré

Jak přečíst platební kartu mobilem a k čemu je to dobré

Pokud vlastníte telefon s technologii NFC, můžete prostřednictvím aplikace pro Android zkusit načíst údaje ze své bezkontaktní karty. Vyzkoušíte si tak třeba, jak moc je náchylná k případnému RFID skimmingu.

Jan Spěšný
NávodyMobilní aplikace
Hrajeme si v PowerShellu: Když Luboška zapne počítač, okamžitě nám dorazí e-mail

Hrajeme si v PowerShellu: Když Luboška zapne počítač, okamžitě nám dorazí e-mail

** Hrátky v PowerShellu pokračují ** Dnes se naučíme vytahovat informace ze systému ** A naplánujeme úlohu, když se ve Windows něco stane

Jakub Čížek
Pojďme programovat elektroniku
Přehledně: Ceny drahých grafik v Česku výrazně padají, hlavní důvody teprve přijdou

Přehledně: Ceny drahých grafik v Česku výrazně padají, hlavní důvody teprve přijdou

** Ceny karet se začínají přibližovat těm stanoveným AMD a Nvidií ** V nižších třídách se už vyplatí grafiky koupit ** U high-endu je ale rozumnější chvíli počkat na novou generaci

Jan Pánek
Cenový přehled