using System; // pievieno pamata funkcijas using System.Collections.Generic; // pievieno List atbalstu using System.IO; // pievieno failu operācijas enum Kategorija { Mape, Datne } // definē mapi vai datni class Vienums // pārstāv gan mapes, gan datnes { public string Vards { get; set; } // tur vienuma nosaukumu public Vienums Parent { get; set; } // atsauce uz augstāko līmeni public List Sub { get; } = new List(); // saraksts ar iekšējiem vienumiem public Kategorija Type { get; set; } // vai tas ir mape vai datne public Vienums(string v, Kategorija t, Vienums p = null) // konstruktorā uzstāda laukus { Vards = v; Type = t; Parent = p; } // iestatīju nosaukumu, tipu un vecāku public void Show() // izvada pašreizējā vienuma saturu { if (Type == Kategorija.Datne) { Console.WriteLine($"[F] {Vards}"); } // ja datne, atzīmē F else { Console.WriteLine($"[D] {Vards}"); foreach (var c in Sub) Console.WriteLine($" -{c.Vards}({c.Type})"); } } // ja mape, parāda bērnus public bool Exist(string n) => Sub.Exists(x => x.Vards == n); // pārbauda, vai eksistē bērns ar šo vārdu public Vienums Find(string n) => Sub.Find(x => x.Vards == n); // atrod bērnu pēc nosaukuma public void Insert(Vienums v) // pievieno jaunu vienumu { if (!Exist(v.Vards)) Sub.Add(v); else Console.WriteLine("Ir jau."); } // ja vēl nav, pievieno, citādi ziņo public void Delete(string n) // dzēš iekšējo vienumu { var e = Find(n); if (e == null) { Console.WriteLine("Neatrasts."); return; } // ja nav tāda, izejam if (e.Type == Kategorija.Mape && e.Sub.Count > 0) { Console.Write($"Dzēst {n}? y/n: "); if (Console.ReadLine() != "y") return; } // prasa apstiprinājumu, ja mape nav tukša if (e.Type == Kategorija.Datne && File.Exists(e.Vards)) File.Delete(e.Vards); // dzēš failu diskā Sub.Remove(e); Console.WriteLine($"Noņemts {n}"); } // izņem no saraksta un ziņo } class FSConductor // galvenā vadības klase { Vienums Root = new Vienums("C:", Kategorija.Mape); // failu sistēmas sakne Vienums Curr; // pašreizējā atrašanās vieta public FSConductor() { Curr = Root; } // konstruktors uzstāda Curr uz sakni public void Run() // interaktīvā cikla sākums { while (true) // mūžīgā cilpa { Console.Write($"{GetPath(Curr)}> "); var inp = Console.ReadLine(); if (string.IsNullOrWhiteSpace(inp)) continue; // gaida komandu var parts = inp.Split(new[] { ' ' }, 2); var cmd = parts[0]; var arg = parts.Length > 1 ? parts[1] : ""; // sadala komandu un parametru if (cmd == "ls") Curr.Show(); // uzskaita saturu else if (cmd == "cd") ChangeDir(arg); // maina mapi else if (cmd == "addfile") Make(arg, Kategorija.Datne); // izveido failu else if (cmd == "addmap") Make(arg, Kategorija.Mape); // izveido mapi else if (cmd == "rmmape") Curr.Delete(arg); // dzēš mapi else if (cmd == "rmfile") DeleteFile(arg); // dzēš failu else if (cmd == "skatit") ReadFile(arg); // rāda faila saturu else if (cmd == "palidziba") PrintHelp(); // rāda palīdzību else if (cmd == "iziet") break; // pārtrauc darbu else Console.WriteLine("Kļūda! raksti palidziba."); // nepazīstama komanda } } void Make(string n, Kategorija t) // izveido mapi vai datni { if (Curr.Exist(n)) { Console.WriteLine("Ir jau."); return; } // ja eksistē, atceļ var v = new Vienums(n, t, Curr); Curr.Insert(v); if (t == Kategorija.Datne) File.WriteAllText(n, ""); } // ja datne, ieraksta tukšu failu void DeleteFile(string n) // dzēš datni { var e = Curr.Find(n); if (e != null && e.Type == Kategorija.Datne) { if (File.Exists(n)) File.Delete(n); Curr.Sub.Remove(e); Console.WriteLine($"Dzēsts {n}"); } else Console.WriteLine("Nepieciešamā datne nav."); } // ziņo, ja nav void ChangeDir(string d) // maina pašreizējo mapi { if (d == "..") { if (Curr.Parent != null) Curr = Curr.Parent; else Console.WriteLine("Saknē esam."); } // vienu uz augšu else if (d == "/") Curr = Root; // pilnīgs ceļš uz sakni else { var e = Curr.Find(d); if (e != null && e.Type == Kategorija.Mape) Curr = e; else Console.WriteLine("Mape nav."); } } // ieiet iekšējā mapi void ReadFile(string n) // izvada faila saturu { var e = Curr.Find(n); if (e == null || e.Type != Kategorija.Datne) { Console.WriteLine("Nav faila."); return; } // pārbauda, vai ir datne if (File.Exists(n)) Console.WriteLine(File.ReadAllText(n)); else Console.WriteLine("[tukšs]"); } // rāda saturu vai tukšumu void PrintHelp() // izvada komandu sarakstu citā secībā { Console.WriteLine("Komandas:"); Console.WriteLine("skatit Rāda faila saturu"); Console.WriteLine("rmmape Dzēš mapi"); Console.WriteLine("rmfile Dzēš failu"); Console.WriteLine("cd Maina mapi"); Console.WriteLine("addfile Izveido datni"); Console.WriteLine("addmap Izveido mapi"); Console.WriteLine("ls Parāda saturu"); Console.WriteLine("palidziba Rāda šo palīdzību"); Console.WriteLine("iziet Beidz darbu"); } // sakārtots citā kārtībā string GetPath(Vienums v) // ģenerē tekstu ceļam { var stack = new List(); for (var x = v; x != null; x = x.Parent) stack.Insert(0, x.Vards); return string.Join("\\", stack); } // savieno līmeņus ar '\' } class Program // palaiž visu sistēmu { static void Main() { new FSConductor().Run(); } } // sāk interaktīvo darbību