10 Jan 2009

Sledování práce se soubory pomocí FileSystemWatcher [C#]

Dneska jsem potkal zajímavou třídu v .NET frameworku, která umožňuje sledovat, co se děje v soubory v zadané složce. Třída se nachází v namespacu Sytem.IO, její velmi důležitou součástí je enumerace NotifyFilters:

<span class="kwrd">public</span> <span class="kwrd">enum</span> <span class="type">NotifyFilters</span> { Attributes, CreationTime, DirectoryName, FileName, LastAccess, LastWrite, Security, Size }

Příklad si ukážeme na adresáři MojeSložka v rootu, která má v sobě několik .txt souborů.

FileSystemWatcher má vlastnost Path typu string, které nastavíme cestu ke sledovanému adresáři, pomocí vlastnosti NotifyFilters (jak už možná víte podle elementů této enumerace) řekneme, které akce se mají sledovat. Do třetice pomocí vlastnosti Filter nastavíme příponu souborů, kterých se bude sledování týkat (v našem případě tedy *.txt). Program se dozví, že se něco stalo, pomocí událostí (překvapivě). V případě třídy FileSystemWatcher jsou tyto události čtyři - Changed, Created, Deleted (tyto tři ve spolupráci s delegátem FileSystemEventHandler) a Renamed (s delegátem RenamedEventHandler). Předpisy delegátů jsou následující:

// FileSystemEventHandler void FileSystemHandler(object source, FileSystemEventArgs e)
// RenamedEventHandler void RenamedHandler(object source, RenamedEventArgs e)

Ukázková aplikace s využitím FileSystemWatcher:

static void Main(string[] args) 
{ 
    FileSystemWatcher watcher = new FileSystemWatcher();

    try
    {
        watcher.Path = @"C:\MojeSložka";
    }

    catch (ArgumentException e)
     {
        Console.WriteLine(e.Message);
        return;
    }
    watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName;
    watcher.Filter = "*.txt";
     watcher.Changed += OnChanged;
    watcher.Created += OnChanged;
    watcher.Deleted += OnChanged;
    watcher.Renamed += OnRenamed;
    // Důležitý krok - nastavením na true
    // začneme sledovat adresář
     watcher.EnableRaisingEvents = true;
    while (Console.Read() != 'q') ;
}

static void OnChanged(object source, FileSystemEventArgs e)
{
    // Něco udělej
}

static void OnRenamed(object source, RenamedEventArgs e)
 {
    // Něco udělej
}