Poznáváme C# a Microsoft.NET 35. díl – izolovaná úložiště

Dnešní díl bych vás rád seznámil s problematikou takzvaných izolovaných úložišt (Isolated storages) a také se způsoby jakými lze s tímto druhem úložiště pracovat. Kromě tohoto tématu se také zmíním o jiné implementaci tříd TextWriter a TextReader než jsou StreamWriter a StreamReader.

Třídy StringReader a StringWriter

V jednom z minulých dílu tohoto seriálu věnovaných otázce vstupně výstupních operací jsme se seznámili s abstraktními třídami TextReader a TextWriter a také s jejich hojně využívanými implementacemi pro čtení a zápis z/do souborů kterými jsou StreamReader a StreamWriter.

Kromě těchto implementací tříd TextReader a TextWriter se v základní knihovně tříd .NET frameworku nachází ještě druhá dvojice implementací, kterou je implementace pro ty nejjednodušší druhy úložišť, kterými jsou instance třídy String nebo StringBuilder. Tyto třídy nesou jméno StringReader a StringWriter. Pro tu první, tedy pro třídy StringReader, je objekt, ze kterého jsou čtena data pomoci rozhraní, které je definováno třídou TextReader, představován instancí třídy String.

/// <summary>
/// Ukazka pouziti tridy StringReader
/// </summary>
public class StringReaderExam
{
public static void RunExam()
  {
    string lStr = "Prvni radek textu";
    //pridame znak noveho radku
    lStr += Environment.NewLine;
    lStr += "Druhy radek textu";
    lStr += Environment.NewLine;
    lStr += "Treti radek textu";
    //vytvorime instanci tridy StringReader a nechame na ni
    //odkazovat ref. promennou typu TextReader
    TextReader lReader = new StringReader(lStr);
    string lLine = null;
    //vypiseme text po radkach
    while( (lLine = lReader.ReadLine()) != null)
      Console.WriteLine(lLine);
  }
}

Jak můžeme vidět, tak je práce s objekty typu StringReader, pro mnoho úloh stejná jako při použití třídy StreamReader a to díky použití rozhraní definované třídou TextReader.

Poznámka: Jelikož jsem chtěl ukázat použití metody Readline, musel jsem vytvořit víceřádkový řetězec. Jedním ze způsobů jak dostat do řetězce znak nového řádku je použití statické vlastnosti NewLine třídy Environment.

Tak jako je třída StringReader implementací TextReaderu pro nejjednodušší datové úložiště v podobě řetězce, tak je třída StringWriter implementací TextWriteru a nyní je datové úložiště představováno instancí třídy StringBuilder.

/// <summary>
/// Ukazka pouziti tridy StringWriter
/// </summary>
public class StringWriterExam
{
  public static void RunExam()
  {
    StringBuilder lBuilder = new StringBuilder();
    //vytvorime instanci tridy StringWriter asociovanou s konkretni
          //instanci tridy StringBuilder
    TextWriter lWriter = new StringWriter(lBuilder);
    //zapiseme data
    lWriter.Write(5.4);
    lWriter.WriteLine();
    lWriter.Write("Text");
    lWriter.Close();
             //vypiseme data
    Console.WriteLine(lBuilder.ToString());
  }
}

Izolovaná úložiště

V některých případech je vhodné pracovat s daty, o kterých máme jistotu, že s nimi žádná jiná aplikace či uživatel manipulovat. Toho je možné dosáhnout použitím nějakých vlastních technik, které ale v určitých případech už mohou být příliš složité a zaberou při vývoji aplikace mnoho času. Právě pro ušetření času s vymýšlením vlastních technik pro dosažení výše zmíněného cíle nám Microsoft. NET framework nabízí k použití takzvaná izolovaná úložiště.

Tato úložiště jsou vyčleněna pro uživatele a pro assembly, takže je zaručena dostatečná úroveň izolace od ostatních aplikací se kterými pracují jiní uživatelé. Předpokládejme příklad, kdy určitý uživatel (např. Jarda) používá .NET aplikaci (např. apl.exe), ukládající svá data ve formě souborů a adresářů, která jsou uložena právě v izolovaném úložišti. Běhové prostředí .NET zaručuje, že jakákoliv jiná .NET aplikace , i když je spuštěna pod tímto uživatelem s těmito daty nebude nijak manipulovat. Navíc .NET runtime zaručuje, že pokud aplikaci apl.exe spustí nějaký jiný uživatel, stejně nebude moci pracovat se soubory, které aplikace vytvořila, když byla spuštěna uživatelem Jarda.

A kde že to izolované úložiště ve vašem systému vlastně je? Odpověď na tuto otázku závisí na tom jaký operační systém používáte. Pokud používáte Microsoft Windows ve verzi 2000 nebo XP naleznete jej na cestě <systémový disk>\Documents and Settings\<uživatel>\Local Settings\Application Data v případě nepřenášeného profilu nebo na cestě <systémový disk>\Documents and Settings\<uživatel> \Application Data pokud pužíváte profíl cestovní. Pokud vás zajímaji jiné verze systému Windows odkážu vás na SDK pro .NET framework.

Pro práci s izolovanými úložišti je v základní knihovně .NET frameworku určen jmenný prostor System.IO.IsolatedStorage. Pro abstrakci oblasti izolovaného úložiště slouží třída IsolatedStorageFile. Pomocí instance této třídy jsme schopni zjistit obsažené soubory a adresáře v izolovaném úložišti, nebo adresáře vytvářet čí odstraňovat. Následující příklad ukazuje jak je možné v izolovaném úložišti vytvořit soubory a adresáře.

public static void WritingExam()
{
  //ziskani izolovaneho uloziste
  IsolatedStorageFile lIsolatedFile = IsolatedStorageFile.GetUserStoreForAssembly();
  //vytvoreni adresare
  lIsolatedFile.CreateDirectory("IsolovanyAdresar");
     
  //vytvoreni noveho souboru v izolovanem ulozisti a zapis dat
  IsolatedStorageFileStream lIsolatedStream = new IsolatedStorageFileStream("test.txt",FileMode.Create,lIsolatedFile);
  lIsolatedStream.Write(new byte[3]{1,2,3},0,3);
  lIsolatedStream.Close();

  //vytvoreni souboru do adresare
  IsolatedStorageFileStream lIsolatedFileStream2 = new IsolatedStorageFileStream("IsolovanyAdresar",FileMode.Create);
  lIsolatedFileStream2.Close();
}

Na začátku si pomocí statické metody GetUserStoreForAssembly získáme odkaz na isolované úložiště vyhrazené pro kombinaci aktuální uživatel a assembly. Pomocí metody CreateDirectory vytvoříme v oblasti izolovaného úložiště adresář. Po té vytvoříme instanci třídy IsolatedStorageFileStream, což je potomek třídy FileStream určený pro práci se soubory v izolovaném úložišti. Stejným způsobem jako s instancí třídy FileStream vytovříme soubor a zapíšeme do něj nějaká data. A jak se soubory či adresáře s konkrétního izolovaného úložiště odstraní? Tak to ukazuje tento příklad:

public static void DeletingExam()
{
  string lFileName = "temp.tmp";
  string lDirName = "tempdir";
  IsolatedStorageFile lIsolatedFile = IsolatedStorageFile.GetUserStoreForAssembly();
  Console.WriteLine("Vytvarim adresar {0}", lDirName);
  lIsolatedFile.CreateDirectory(lDirName);
  Console.WriteLine("Vytvarim soubor {0}",lFileName);
  //vytvorime stream asociovany s konkretnim souborem uloziste a jeho pomoci vytvorime soubor
  IsolatedStorageFileStream lIsolatedStream = new IsolatedStorageFileStream(lFileName,FileMode.Create,lIsolatedFile);
  lIsolatedStream.Close();
  Console.WriteLine("Mazu soubor {0}",lFileName);
  lIsolatedFile.DeleteFile(lFileName);
  Console.WriteLine("Mazu adresar {0}",lDirName);
}

Získat všechny oblasti izolovaných úložišť je možné použitím enumerátoru, který získáme zavoláním metody GetEnumerator na třídě IsolatedStorageFile. Toho mimo jiné využívá i následující příklad.

public static void EnumeratingExam()
{
  //ziskame vsechny soubory predstavujici isolovane uloziste
  IEnumerator lEnum = IsolatedStorageFile.GetEnumerator(IsolatedStorageScope.User);
  while(lEnum.MoveNext())
  {
    IsolatedStorageFile lFile = (IsolatedStorageFile) lEnum.Current;
    //ziskani informaci o assembly
    Url lUrl = (Url)lFile.AssemblyIdentity;
    Console.WriteLine("Assembly : {0}", lUrl.Value);
    //vypsani velikost souboru izolovaneho uloziste
    Console.WriteLine("Velikost : {0}: ", lFile.CurrentSize);

    //ziskani souboru obsazenych v izol. ulozisti
    string[] lFiles = lFile.GetFileNames("*");
    Console.WriteLine("Obsazene soubory :");
    for(int i = 0; i < lFiles.Length; i++)
    {
      Console.WriteLine(lFiles[i]);
    }
  }
}

Jak můžete v příkladu vidět, tak cestu k assembly ke které je izolované úložiště asociováno, je možné získat přečtením vlastnosti AssemblyIdentity na instanci třídy IsolatedStorageFile. Seznam adresářů a souborů v konkrétním izolovaném úložišti je možné získat pomocí metody GetFileNames, jíž ve formě parametru předáme řetězec představující filtr.

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

Diskuze (9) Další článek: Česká verze Windows Vista dva měsíce po anglické

Témata článku: Software, Microsoft, Windows, Programování, Úložiště, Určitý objekt, Určitý uživatel, Public, Currents, Microsoft NET, Určitá forma, Díl


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

Internet poslední naděje. Kdo má nejlepší tarif „LTE na doma“?

Internet poslední naděje. Kdo má nejlepší tarif „LTE na doma“?

** Srovnali jsme fixní LTE připojení od tuzemských operátorů ** Liší se rychlostmi, cenou i podmínkami ** Na co všechno dát pozor?

Lukáš Václavík | 27

Jak se žije s telefonem bez Googlu: Čerstvé zkušenosti s telefony Honor a Huawei

Jak se žije s telefonem bez Googlu: Čerstvé zkušenosti s telefony Honor a Huawei

** Honor u nás přichází s prvním telefonem bez Google Mobile Services ** Současný stav je lepší než na začátku, ideální ale není ** Zkusili jsme i hack s ručním přidáním služeb Googlu

Tomáš Holčík | 162

Google mapy, Seznam mapy, Apple mapy... Velké srovnání šesti internetových map. Kdo to dělá nejlépe?

Google mapy, Seznam mapy, Apple mapy... Velké srovnání šesti internetových map. Kdo to dělá nejlépe?

** Která klasická webová mapa se vám líbí nejvíce? ** Srovnali jsme šest velkých služeb v několika situacích ** Hlasujte v anketě

Jakub Čížek | 78


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ě