Obecné informace
Zadání musíte splnit v časovém limitu 3 hodiny, který začíná po vysvětlení zadání a zodpovězení dotazům k zadání. Je možné pokládat dotazy i během testu, ale tak, aby nerušily vaše kolegy při práci.
Vaše řešení bude testováno v prostředí ReCodEx. Je tedy nutné dbát na detaily ze zadání (např. co se týče přesného obsahu chybových/informačních hlášení).
Hodnotí se také tvar odevzdaného souboru, tedy navrhněte vhodnou architekturu, dodržujte programátorské konvence, dbejte na úpravu, pište hezký, dobře členěný a hlavně čitelný kód. Programy bez rozumné dekompozice (např. obsahující pouze pár metod), případně programy s nečitelnými zdrojovými kódy a jim podobné nebudou uznány!
Je dovoleno používat tištěné i elektronické materiály, pokud to není přímo řešení dané (nebo podobné) úlohy nebo její dílčí části. Nezapomeňte, že pokud kopírujete nějaký kód, který Vám nepatří, je nutné uvést zdroj! Není dovolena jakákoliv forma komunikace s kýmkoliv z jakéhokoliv důvodu (kromě zkoušejících) - do toho se počítá i to, že není dovolena komunikace s libovolnou umělou inteligencí (AI) nad rámec standardní IntelliSense ve Visual Studiu (tj. je zakázáno používat služby jako ChatGPT, GitHub Copilot, apod.).
Až budete s Vaším řešením spokojení, přihlaste se a vyčkejte na zkoušejícího, který s Vámi řešení projde. Pokud zkoušející najde ve Vašem řešení nějaké problémy, můžete je v rámci časového limitu odstranit. Pokud ze zápočtového testu samovolně odejdete bez toho, aby zkoušející Vaše řešení spolu s Vámi procházel, tak jste zápočtový test nesložili (a to i pokud Vám v ReCodExu prošly testy na 100%) - osobní předvedení zkoušejícímu na místě je povinnou součástí testu.
Řešení je nutné splnit na 100% správnosti.
Zadání: In-memory souborový systém
Vaším úkolem je naprogramovat aplikaci, která simuluje jednoduchý souborový systém v paměti (in-memory). Aplikace přijímá textové příkazy, které manipulují s adresáři a soubory. Příkazy se provádí sekvenčně v pořadí, v jakém jsou zadávány.
Aplikace podporuje dva režimy spuštění:
Bez argumentu:
MyFileSystem.exe
Aplikace čte příkazy ze standardního vstupu.
Výstup příkazů je vypisován na standartní výstup.
S argumentem příkazové řádky:
MyFileSystem.exe skript.txt
Pokud je zadán argument, aplikace načte a vykoná příkazy ze zadaného souboru. Po dokončení souboru aplikace nekončí, ale pokračuje čtením příkazů ze standardního vstupu.
Stav systému (vytvořené složky, aktuální cesta ...) zůstává zachován.
Výstup jednotlivých příkazů (včetně těch ze souboru) je vypisován na standartní výstup.
Program skončí až dojde k ukončení/uzavření standardního vstupu.
Specifikace souborového systému
Systém je organizován jako stromová struktura začínající v kořenovém adresáři (Root), který je označen znakem /.
Položky: Systém rozlišuje dva typy položek: Adresáře (Directory) a Soubory (File).
Názvy: Každá položka má jméno (posloupnost znaků neobsahující bílé znaky). Jména jsou "case-sensitive" (záleží na velikosti písmen).
Unikátnost: V rámci jednoho adresáře musí být názvy položek (souborů i podadresářů) unikátní.
Stav: Program si udržuje informaci o aktuálním adresáři. Po spuštění je aktuálním adresářem kořenový adresář (/) a tento adresář je prázdný.
Zpracování vstupu
Pokud uživatel zadá příkaz, jehož provedení skončí s chybou, aplikace vypíše relevantní chybovou hlášku na standardní výstup (ve formátu Error: ...) a čeká na další příkaz. Aplikace po chybě nespadne.
Následující chyby mají přednost a kontrolují se před vykonáním samotné logiky příkazu:
1. Neznámý příkaz
Pokud název příkazu (první slovo na řádku) neodpovídá žádnému z definovaných příkazů.
Výpis: "Error: unknown command commandName"
< format C: > Error: unknown command format
Poznámka k formátu zadání: V příkladech se pro přehlednost používají znaky < a >, které značí, zda jde o vstup od uživatele (<) nebo výstup programu (>). Ve vašem řešení se tyto symboly nevypisují. Předchozí příklad by tedy reálně vypadal takto:
format C: Error: unknown command format
2. Špatný počet argumentů
Pokud je validní příkaz zavolán s nesprávným počtem argumentů (např. mkdir bez názvu nebo cd s dvěma cestami).
Výpis: "Error: wrong number of arguments"
< mkdir > Error: wrong number of arguments
Příkazy
Jednotlivé argumenty příkazů jsou odděleny mezerami.
(prázdný řádek)
Prázdný příkaz. Neudělá nic.
mkdir dirName
Vytvoří nový podadresář se jménem
dirNamev aktuálním adresáři.Příklad použití:
< mkdir docs
Chyba: Pokud položka (soubor nebo adresář) se stejným názvem již v aktuálním adresáři existuje.
Výpis: "Error: directory or file with name dirName already exists"
ls
Vypíše obsah aktuálního adresáře na standardní výstup.
Třídění: Nejprve se vypíší adresáře (seřazené abecedně), poté soubory (seřazené abecedně).
Formát: Adresáře mají prefix
dir, soubory mají prefixfile.Příklad použití: (Předpokládejme, že v adresáři existuje složka
dataa souborreadme.txt)
< ls > dir data > file readme.txt
update fileName content1 content2 ... contentN
V aktuálním adresáři vytvoří soubor
fileNames obsahem složeným z argumentůcontent1ažcontentN.Obsah souboru vznikne spojením těchto argumentů, oddělených jednou mezerou.
Pokud soubor již existuje, jeho obsah se přepíše. Pokud neexistuje, vytvoří se nový.
Příklad použití:
< update poznamky.txt Nakoupit mleko a rohliky
Chyba: Pokud již existuje adresář se stejným názvem jako
fileName.Výpis: "Error: cannot update directory fileName as a file"
cd destination
Změní aktuální adresář na
destination. Argument může nabývat těchto hodnot:/: Přepne do kořenového adresáře.
..: Přepne do nadřazeného adresáře (rodiče). Pokud je aktuální adresář kořenový, nic se nestane.
dirName: Přepne do podadresáře s tímto jménem (v rámci aktuálního adresáře).Příklad použití:
< cd docs < cd ..
Chyba: Pokud cílový podadresář v aktuálním adresáři neexistuje.
Výpis: "Error: directory destination not found"
cat fileName
Vypíše na standardní výstup obsah souboru
fileName, který se nachází v aktuálním adresáři.Příklad použití:
< cat poznamky.txt > Nakoupit mleko a rohliky
Chyba: Pokud soubor v aktuálním adresáři neexistuje.
Výpis: "Error: file fileName not found"
rm itemName
Odstraní položku (soubor nebo adresář) se jménem
itemNamez aktuálního adresáře.Příklad použití:
< rm stare_poznamky.txt
Chyba 1: Pokud položka neexistuje.
Výpis: "Error: item itemName not found"
Chyba 2: Pokud je mazanou položkou adresář a tento adresář není prázdný.
Výpis: "Error: directory itemName not empty"
pwd
Vypíše na standardní výstup celou cestu k aktuálnímu adresáři (absolutní cestu).
Formát cesty:
/dir1/dir2. Cesta kořenového adresáře je /.Příklad použití:
< pwd > /docs/work
Příklady
Všechny testovací příklady z ReCodExu, včetně jejich referenčních výstupů, jsou k dispozici zde.
Vstupní soubory se dělí dle typu testu:
Soubory s příponou
.insimulují standardní vstup (interaktivní režim).Soubory s příponou
.file.inslouží jako skript předaný v argumentu příkazové řádky.
Očekávané výstupy mají příponu .out.
Příklad 1: Interaktivní režim (bez argumentů)
< pwd > / < mkdir data < ls > dir data < cd data < pwd > /data < update notes.txt hello world < ls > file notes.txt < cat notes.txt > hello world < cd .. < rm data > Error: directory data not empty < cd data < rm notes.txt < cd .. < rm data < ls
Příklad 2: Režim se skriptem Předpokládejme, že soubor script.txt obsahuje:
mkdir docs cd docs update readme.txt Initial content ls cat readme.txt
Spuštění programu: MyFileSystem.exe script.txt
(Program vykoná příkazy ze script.txt a jejich výstup vypisuje ...) > file readme.txt > Initial content < pwd > /docs < ls > file readme.txt < cat readme.txt > Initial content < cd unknownDir > Error: directory unknownDir not found