Poznáváme C# a Microsoft.NET 34. díl – informace o adresářích a sledování souborového systému

Tento díl si bere za své seznámit vás s možnostmi zjišťování informací o adresářích a ve své druhé části také se zajímavým způsobem sledování změn souborového systému.

Třída Directory

První část tohoto dílu věnuji navázání na problematiku, kterou jsem zakončil díl minulý a tou byla třída File pro práci se soubory. Stejně jako je třída File určena pro manipulaci se soubory, tak třída Directory slouží pro takovéto operace s adresáři. Tyto operace jsou stejně jako u třídy File implementovány ve formě statických metod. Použití některých z těchto metod by mohlo vypadat nějak takto:

/// <summary>
/// Ukazka pouziti vybranych metod tridy Directory
/// </summary>
public class DirectoryExam
{
  public static void Example()
  {
    string lDirPath = @"C:\testdir";
    //pokud dany adresar existuje, tak jej smazeme
    if (Directory.Exists(lDirPath))
    {
      Console.WriteLine("Mazu stary adresar..");
      Directory.Delete(lDirPath);
    }
    Console.WriteLine("Vytvarim novy adresar..");
    //vytvoreni noveho adresare
    Directory.CreateDirectory(lDirPath);
    //nastaveni casu vytvoreni adresare - 5 let po soucasnosti
    DateTime lCreationTime = DateTime.Now.AddYears(5);
    Console.WriteLine("Nastavuji cas vytvoreni adresare {0} na {1}",lDirPath,lCreationTime);
    Directory.SetCreationTime(lDirPath, lCreationTime);
  } 
}

Třídy FileInfo a DirectoryInfo

Třídy File a Directory nepředstavují jediný způsob, jak zjišťovat informace o souborech respektive adresářích nebo s nimi manipulovat. Druhou možností jsou třídy FileInfo a DirectoryInfo, které se taktéž nacházejí ve jmenném prostoru System.IO. Na rozdíl od dříve zmiňovaných tříd je potřeba pro provádění operací pomocí této dvojice tříd vytvořit jejich instance namísto volání statických metod.

To s sebou přináší výhodu v případech, kdy se určitou instanci chystáme použít vícekrát a to z důvodu, že při používání statických metod tříd File a Directory jsou vždy ověřována přístupová práva k objektu. Naproti tomu jsou v případě tříd FileInfo a DirectoryInfo přístupová práva kontrolována pouze u některých metod a při vytváření instance. Jinak jsou poskytované operace této dvojice tříd velmi podobné s operacemi nabízenými třídami File a Directory. Na ukázku je zde tento příklad, který obsahuje použití třídy DirectoryInfo.

/// <summary>
/// Ukazka pouziti tridy DirectoryInfo
/// </summary>
public class DirectoryInfoExam
{
  public static void Example()
  {
    string lDirPath = @"C:\testdir";
    DirectoryInfo lTestInfo = new DirectoryInfo(lDirPath);
    if (lTestInfo.Exists)
    {
      Console.WriteLine("Jmeno : {0}",lTestInfo.Name);
      Console.WriteLine("Korenovy adresar : {0}", lTestInfo.Root);
      string lSubDirName = @"testsubdir";
      DirectoryInfo[] lDirs = lTestInfo.GetDirectories();
      //pokud existuji nejake podadresare tak je vypiseme
      if (lDirs.Length > 0)
      {
        Console.WriteLine("Obsazene podadresare : ");
        foreach(DirectoryInfo lCurrentInfo in lDirs)
          Console.WriteLine(lCurrentInfo.Name);
        Console.WriteLine("Vytvarim podadresar {0}..",lSubDirName);
      }
      lTestInfo.CreateSubdirectory(lSubDirName);
    }
    else
      Console.WriteLine("Adresar {0} neexistuje",lDirPath);
  }
}

Sledování změn souborového systému

V základní knihovně tříd prostředí .NET framework existuje zajímavá třída, která nám umožňuje sledovat změny v souborovém systému. Jedná se o třídu FileSystemWatcher a je obsažena ve jmenném prostoru System.IO. Této třídě pomocí její instanční vlastnosti Path nastavíme adresář jehož obsah chceme sledovat. Po tomto přiřazení si můžeme pomocí instancí delegátů FileSystemEventHandler a RenamedEventHandler předplatit události které tato třída zveřejňuje.

Mezi tyto události patří Changed, Created, Deleted a Renamed. Událost Changed je vyvolána v případě změny obsaženého souboru či adresáře jako je změna velikosti, atributů nebo nastavení zabezpečení, událost Created zase v případě vytvoření nového souboru či adresáře ve sledovaném adresáři, událost Delete je vyvolána když je ve sledovaném adresáři nějaký soubor nebo adresář smazán a událost Renamed když je soubor nebo adresář přejmenován.

Důležitou instanční vlastností je také vlastnost EnableRaisingEvents, pomocí které nastavujeme jestli má instance třídy FileSystemWatcher již reagovat na změny v souborovém systému vyvoláváním výše zmíněných událostí. Další booleanovská vlastnost, která nese název IncludeSubdirectories indikuje jestli má být reagováno i na změny v podadresářích sledovaného adresáře. Následující příklad sleduje změny v určitém adresáři pomocí zmiňované třídy FileSystemWatcher.

/// <summary>
/// Priklad na sledovani zmen v adresari pomoci tridy FileSystemWatcher
/// </summary>
public class FileSystemWatcherExam
{
  public static void WatchFile(string path)
  {
    FileSystemWatcher lWatcher = new FileSystemWatcher();
    //nastavime adresar, ktery ma byt sledovan
    lWatcher.Path = path;
    //vytvorime instance delegatu
    lWatcher.Changed += new FileSystemEventHandler(FSChanged);
    lWatcher.Deleted += new FileSystemEventHandler(FSDeleted);
    lWatcher.Renamed += new RenamedEventHandler(FSRenamed);
    lWatcher.Created += new FileSystemEventHandler(FSCreated);
//nastavime, ze maji byt sledovany i zmeny ve vnorenych adresarich
    lWatcher.IncludeSubdirectories = true;
    //spustime sledovani
    lWatcher.EnableRaisingEvents = true;
    Console.WriteLine("Sleduji adresar {0}..",path);
    Console.ReadLine();
  }

  private static void FSChanged(object sender, FileSystemEventArgs e)
  {
    Console.WriteLine("Objekt {0} v adresari byl zmenen  - {1}",e.Name,e.ChangeType);
  }

  private static void FSDeleted(object sender, FileSystemEventArgs e)
  {
    Console.WriteLine("V adresari byl smazan objekt {0}",e.Name);
  }

  private static void FSRenamed(object sender, RenamedEventArgs e)
  {
    Console.WriteLine("V adresari byl objekt {0} prejmenovan na {1}",e.OldFullPath,e.Name);
  }

  private static void FSCreated(object sender, FileSystemEventArgs e)
  {
    Console.WriteLine("V adresari byl vytvoren objekt {0}",e.Name);
  }
}

Zajímavou vlastností této třídy, kterou bych rád zmínil je vlastnost NotifyFilter, které pomocí výčtu NotifyFilters můžeme specifikovat skupinu změn souborového systému pří kterých má být vyvolána událost Changed. Takže pokud bychom do příkladu přidali následující řádek:

lWatcher.NotifyFilter = NotifyFilters.Attributes | NotifyFilters.Security;

Bude událost Changed vyvolána pouze v případech, že je změněn atribut nějakého obsaženého objektu nebo je změněno jeho nastavení zabezpečení.

Zdrojové kódy k příkladům jsou k dispozici zde.

Diskuze (11) Další článek: Uvedena česká verze antiviru NOD32 pro 64bitové systémy

Témata článku: Software, Microsoft, Programování, Soubor, Sledování, Maja, Adresář, Díl, Určitý objekt, Public, Microsoft NET, Private


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


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ě