Responsabili:
“Caaaaaade, dă-te bă că cade!”
despre arbori, Mihai Mărgineanu (1969 - prezent)
Scopul temei constă în implementarea unui sistem de fișiere arborescent (conținând fițiere și directoare) ce poate fi manipulat prin intermediul comenzilor stil bash
.
Structura de bază pe care o veți folosi este FileTree
:
struct FileTree { TreeNode* root; };
Acesta conține elemente de tip TreeNode
, ce pot fi atât fișiere cât și directoare:
struct TreeNode { TreeNode* parent; char* name; enum TreeNodeType type; void* content; };
Fiecare dintre acestea are:
FILE_NODE
/FOLDER_NODE
(conform enum
-ului TreeNodeType
)
Din moment ce conținutul diferă semnificativ în cazul în care nodul este un director, respectiv fișier, am ales să îl reprezentăm printr-o variabilă de tip void*
. Aceasta va fi convertită în momentul folosirii într-unul din tipurile:
struct FileContent { char* text; };
struct FolderContent { List* children; };
Astfel, un fișier are drept conținut un șir de caractere ce nu conține spații, iar un director are o listă de copii, reprezentând resursele (fișiere/directoare) pe care le conține.
Nu în ultimul rând, această listă de resurse este reprezentată prin:
struct List { ListNode* head; };
ce conține elemente de tip:
struct ListNode { TreeNode* info; ListNode* next; };
touch <filename> [filecontent]
- 7pfilecontent
este specificat, acesta va deveni conținutul fișierului.$ touch a content_a $ touch b content_b $ ls b a
ls [arg]
- 7pls: cannot access '<arg>': No such file or directory
$ touch a content_a $ ls a a: content_a $ touch b content_b $ ls b b: content_b $ touch c content_c $ ls c c: content_c $ touch d content_d $ ls d c b a
mkdir <dirname>
- 7pmkdir: cannot create directory ‘<dirname>’: File exists
.$ touch a content_a $ ls a $ mkdir B $ ls B a $ touch c $ ls c B a
cd <path>
- 7p<path>
, returnând directorul destinație.<path>
este de tipul dir1/dir2/dir3/dir4/...
.<path>
se poate face referire și la directorul părinte prin utilizarea ..
cd: no such file or directory: <path>
și va returna directorul curent.$ mkdir A $ cd A $ touch a $ ls a
tree [path]
- 8px directories, y files
.path
-ul nu poate fi parcurs sau se termină cu un fișier, se va afișa eroarea: <path> [error opening dir]\n\n0 directories, 0 files\n
.$ mkdir A $ cd A $ mkdir B $ cd B $ touch b $ cd .. $ mkdir C $ cd C $ touch c $ touch d $ cd ../.. $ touch x content_x $ tree x A C d c B b 3 directories, 4 files
pwd
- 7p$ mkdir A $ cd A $ pwd root/A
rmdir <dirname>
- 7prmdir: failed to remove '<dirname>': No such file or directory
.rmdir: failed to remove '<dirname>': Directory not empty
.rmdir: failed to remove '<dirname>': Not a directory
.$ mkdir A $ mkdir B $ rmdir A $ ls B
rm <filename>
- 7prm: cannot remove '<filename>': Is a directory
.rm: failed to remove '<filename>': No such file or directory
$ mkdir A $ touch a $ mkdir B $ touch c $ touch d $ rm c $ ls d B a A
rmrec <resourcename>
- 7prmrec: failed to remove '<resourcename>': No such file or directory
.$ mkdir A $ mkdir B $ cd B $ touch b $ cd .. $ mkdir C $ rmrec B $ ls C A
cp <source_path> <destination_path>
- 8pcp: -r not specified; omitting directory '<source_path>'
.cp: failed to access '<destination_path>': Not a directory
.$ mkdir A $ cd A $ touch a content_a $ cp a .. $ cd .. $ ls a A
mv <source_path> <destination_path>
- 8pcp
, cu excepția cazului în care sursa este un director, caz în care nu se va afișa o eroare, ci se va muta directorul, împreuna cu tot conținutul acestuia, la noua cale.$ mkdir A $ touch a $ mv a A $ tree A a 1 directories, 1 files
Eliberarea memoriei se va verifica folosind utilitarul Valgrind. O temă ce conține memory leaks pe un test va atrage după sine punctajul de 0p pe testul respectiv.
Nu copiați! Toate soluțiile vor fi verificate folosind o unealtă de detectare a plagiatului. În cazul detectării unui astfel de caz, atât plagiatorul cât și autorul original vor primi punctaj 0 pe toate temele! De aceea, vă sfătuim să nu vă lăsați rezolvări ale temelor pe calculatoare partajate (la laborator etc), pe mail/liste de discuții/grupuri etc.
Q: Tema 3 se poate face în C++?
A: Nu.
Q: Se pot folosi variabile globale?
A: Nu.
ATENȚIE să nu postați imagini cu părți din soluția voastră pe forumul pus la dispoziție sau orice alt canal public de comunicație. Dacă veți face acest lucru, vă asumați răspunderea dacă veți primi copiat pe temă.