Právě mám rozdělaný jeden prográmek, který pracuje s adresářovou strukturou. Ten program ještě není hotový, ale jedna jeho část se už dá zveřejnit. Je to sice jen pomocná část, potřebuju ji jen pro ladící účely, ale má svůj význam i samostatně. Konkrétně se jedná o funkci na výpis adresářové struktury ve formě textového stromu.
Výstup programu vypadá například takhle:

class DirectoryHandler
Vše obstarává moje třída DirectoryHandler, respektive její metoda printTextTree. Třída DirectoryHandler má v této verzi jen dvě veřejné metody, kromě printTextTree je to filterItems pro omezení výpisu jen na určité typy souborů. Použití je velmi jednoduché:
#include "directoryHandler.h" int main() { DirectoryHandler dirhand("/Users/jirirohan/Documents"); dirhand.filterItems("(.*\\.pdf)"); dirhand.printTextTree(); return 0; }
Po zavolání konstruktoru se v paměti vygeneruje stromová struktura z tříd DirItem s uvedeným adresářem jako vrcholem. V paměti zůstává až do zavolání destruktoru.
DirectoryHandler::filterItems
Metoda filterItems slouží k filtrování výstupu. Její deklarace vypadá takhle:
void filterItems(std::string mask, int type = (ITYPE_FILE + ITYPE_DIRECTORY));
První parametr mask je regulární výraz pro filtr názvů. Nepovinný parametr type odfiltruje typy souborů, například zástupce, socket, block device… defaultně se zobrazují jen adresáře a soubory, víc v tuto chvíli ani nepotřebuju.
Zavoláním filterItems se adresářová struktura z DirItems v paměti nezmění, pouze se jednotlivé prvky označí, jestli se mají nebo nemají tisknout (proměnná printThis). V případě opakovaného volání filterItems se tedy nebude ztrácet čas a výkon na znovugenerování struktury, jen se již existující strom rekurzivně projde a jednotlivé prvky se přeznačí.
DirectoryHandler::printTextTree
Metoda printTextTree je bez parametrů, po jejím zavování se na stdout vypíše adresářová struktura odpovídající filtru. Pokud jsme žádný filtr nezadali, vypíše se všechno.
Upozornění
V programu je ještě několik míst, které musím ještě doladit. Například při výpočtu délky názvu souborů mi občas vycházejí špatné hodnoty, protože std::string::size() vrací počet členů řetězce, ale jeden tištěný znak může být složen z více členů. Udělal jsem sice pro tyto účely funkci utf8stringSize(), ale není ještě dokonalá, počítá správně jen některé znaky. Na tom ještě musím zapracovat. Ta chybička, která vzniká u adresářů s některými diakritickými znaky v názvu, je vidět na obrázku v příkladu u adresáře Lynn-Flewelling—Noční-běžci. Program vypočítal délku názvu mnohem delší a úroveň souborů v tomto adresáři je o několik znaků dál, než by měla být. Později se na problematiku UTF8 zaměřím a opravím to.
Program jsem dělal na Mac OS X, a to je unixový systém. Pro práci s adresáři používám knihovnu dirent.h, se která asi nebude fungovat pod Windows. Hlavně ta část, která identifikuju typ souborů. Pod Windows totiž neexistují typy block device, pipe nebo socket. A ani vlastně nemám zájem, aby to pod Windows fungovalo, i když po několika menších úpravách by to šlo. V Linuxových a Unixových systémech by to mělo fungovat bez problémů.
Source
Zdrojové soubory si můžete stáhnout zde TextTree.zip Brzy dokončím první program, který bude tyhle třídy používat, a pravděpodobně nebude jen jeden. Samozřejmě ho sem nahraju.