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: Software, Microsoft, Programování, Proud, Stream, Díl, Public, Základní knihovna, Microsoft NET


Určitě si přečtěte

Porovnání deseti cloudových disků: kam a za kolik uložit 100 GB, 1 TB a 10 TB dat?

Porovnání deseti cloudových disků: kam a za kolik uložit 100 GB, 1 TB a 10 TB dat?

** Zjistili jsme, kam do cloudu nejvýhodněji uložíte data ** Vytvořili jsme žebříček cen deseti cloudových úložišť ** Ceny se liší - často i velice výrazně!

Karel Kilián | 102

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

Šmírování kamerami Googlu: Koukněte, co šíleného se 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 | 4

Z rozmazané šmouhy krásná fotka. Takhle kouzlí nová umělá inteligence MyHeritage

Z rozmazané šmouhy krásná fotka. Takhle kouzlí nová umělá inteligence MyHeritage

** MyHeritage slibuje nejlepší neuronovou síť pro vylepšování fotek ** Funguje tím líp, čím horší fotku upravuje ** Otestovali jsme desítky různých snímků

Marek Lutonský, Lukáš Václavík | 39

Na měsíc jsem opustil Google a potupně se zase vrátil zpět (komentář)

Na měsíc jsem opustil Google a potupně se zase vrátil zpět (komentář)

** Zkusil jsem se zbavit závislosti na vyhledávači od Googlu ** Jako alternativy posloužily Bing, Seznam a DuckDuckGo ** Mají své silné stránky, ale i nepřekonatelná negativa

Lukáš Václavík | 70

Apple vychrlil novinky: Nové operační systémy a příprava na vlastní procesory

Apple vychrlil novinky: Nové operační systémy a příprava na vlastní procesory

** Apple dnes představuje novinky ** Tradiční keynote v rámci konference WWDC probíhá jen online ** Nové operační systémy, ale i něco navíc

David Polesný | 109


Aktuální číslo časopisu Computer

Megatest mobilů do 8 000 Kč

Test bezdrátových headsetů

Linux i pro začátečníky

Jak surfovat anonymně