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í:

  1. Bez argumentu: MyFileSystem.exe

  • Aplikace čte příkazy ze standardního vstupu.

  • Výstup příkazů je vypisován na standartní výstup.

  1. 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 dirName v 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í prefix file.

  • Příklad použití: (Předpokládejme, že v adresáři existuje složka data a soubor readme.txt)

< ls
> dir data
> file readme.txt

update fileName content1 content2 ... contentN

  • V aktuálním adresáři vytvoří soubor fileName s obsahem složeným z argumentů content1contentN.

  • 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 itemName z 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 .in simulují standardní vstup (interaktivní režim).

  • Soubory s příponou .file.in slouží 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