static void LSCommand(List <string> arguments) { int pageNum; if (arguments.Count == 0) { ConsoleDrawings.PrintError("Неверные параметры..."); return; } else if (arguments.Count == 1) { if (arguments[0] == "/?") { ConsoleDrawings.PrintInformation("ls <путь> <номер страницы> - команда выводит дерево указанного каталога с указанным номером страницы"); } else if (arguments[0] == "..") { DirectoryInfo parentDirectory = Directory.GetParent(CurrentPath); if (parentDirectory == null) { ConsoleDrawings.PrintWarning("Не существует родительской директории для указанного каталога"); } else { CurrentPath = parentDirectory.FullName; ConsoleDrawings.PrintFoldersTree(CurrentPath, CurrentFoldersFiles, 1); } } else //if(Directory.Exists(arguments[0]))//если не указан номер страницы, выводим первую { CurrentPath = arguments[0]; ConsoleDrawings.PrintFoldersTree(CurrentPath, CurrentFoldersFiles, 1); } } else if (arguments.Count == 2) //если два аргумента в команде, значит можно реализовать команду { CurrentPath = arguments[0]; //первый аргумент должен быть путь try { pageNum = Convert.ToInt32(arguments[1]); } catch (FormatException) { pageNum = 1; ConsoleDrawings.PrintWarning("Некорректный аргумент <номер страницы> - выводим 1ю страницу..."); } if (pageNum == 0) { pageNum = 1; } ConsoleDrawings.PrintFoldersTree(CurrentPath, CurrentFoldersFiles, pageNum); } else//если аргументов более 2х, возможно путь разделен пробелами { //пытаемся собрать путь, предположив, что он разделен пробелами string resPath = ""; for (int i = 0; i < arguments.Count - 1; i++) { resPath += arguments[i]; resPath += " "; } resPath = resPath.Trim(); try { pageNum = Convert.ToInt32(arguments[arguments.Count - 1]); } catch (FormatException) { resPath += " "; resPath += arguments[arguments.Count - 1]; pageNum = 1; } CurrentPath = resPath; ConsoleDrawings.PrintFoldersTree(CurrentPath, CurrentFoldersFiles, pageNum); //ConsoleDrawings.PrintError("Невозможно распознать команду, - аргументов более 2х"); } }
static void Main(string[] args) { //фиксируем размеры окна, чтобы нельзя было его изменить WindowUtility.FixeConsoleWindow(Configuration.ConsoleHeight, Configuration.ConsoleWidth); //рисуем рамку для основной панели с папками/файлами ConsoleDrawings.PrintFrameLines(0, 0, Console.WindowWidth, Configuration.MainPanelHeight); ConsoleDrawings.PrintFrameLines(0, Configuration.MainPanelHeight, Console.WindowWidth, Configuration.InfoPanelHeight); //считывание сохраненного пути с последнего сеанса работы if (File.Exists("last.state")) { using (StreamReader sr = new StreamReader("last.state")) //File.OpenText(inputFile)) { string strState = ""; try { strState = sr.ReadLine(); } catch (Exception) { CurrentPath = "C:\\"; } CurrentPath = strState; } } else { CurrentPath = "C:\\"; } ConsoleDrawings.PrintFoldersTree(CurrentPath, CurrentFoldersFiles, 1); //справка: ConsoleDrawings.PrintInformation("help - список всех поддерживаемых комманд"); bool exit = false; List <string> arguments = new List <string>(); while (!exit) { ConsoleDrawings.TakeNewCommand(); currentCommand = Console.ReadLine(); ConsoleDrawings.ClearMessageLine(); arguments.Clear();//по завершении обработки команды очищаем список аргументов, чтобы корректно обработать следующую команду arguments.AddRange(currentCommand.Split(' ')); string theCommand = arguments[0]; arguments.Remove(theCommand); switch (theCommand.ToLower().Trim()) { case "exit": SaveLastState(); exit = true; break; case "ls": LSCommand(arguments); break; case "cp": CPCommand(arguments); break; case "rm": RMCommand(arguments); break; case "file": FILECommand(arguments); break; case "help": ConsoleDrawings.PrintInformation("Поддерживаемые команды: exit; ls; cp; rm; file. Введите команду с ключом /? чтобы получить подробное описание"); break; case "": arguments.Clear(); break; default: ConsoleDrawings.PrintWarning($"Невозможно обработать команду {theCommand}"); arguments.Clear(); break; } } }
public static void PrintFoldersTree(string rootFolder, List <FileSystemInfo> content, int pageNum)//вовод дерева каталогов { if (content.Count == 0) { //если список файлов/папок пуст, ничего не выводим, просто оставляем старое дерево if (!Directory.Exists(rootFolder)) { return; } //если директория существует, но она пуста, то дерево все равно надо вывести } //рисуем в заголовке текущую директорию + номер страницы int maxPage; string header = rootFolder; if (content.Count != 0) { float pageNumCoefficent = (float)content.Count / (float)Configuration.ElementsOnPage; maxPage = (int)Math.Ceiling(pageNumCoefficent); } else // если папки отсутствуют в текущей директории вручную пишем количество страниц { maxPage = 1; } if (pageNum > maxPage) { pageNum = maxPage; ConsoleDrawings.PrintWarning($"Некорректный аргумент <номер страницы> максимально допустимая страница - {maxPage}"); } header += $" - [{pageNum}/{maxPage}]"; PrintMainPanelHeader(header); int positionX, positionY; positionX = 2; positionY = 1; ClearMainPanel(); Console.SetCursorPosition(positionX, positionY); Console.WriteLine(rootFolder); positionY++; if (pageNum != 1)//если выводим не 1ю страницу, то рисуем дополнительно "<..>", чтобы было понятно, то это не начало дерева { Console.SetCursorPosition(positionX, positionY); Console.Write(TreeLines.DownContinue); Console.Write(TreeLines.Right); Console.Write("<..>"); positionY++; } for (int i = (pageNum - 1) * Configuration.ElementsOnPage; i < content.Count; i++) { Console.SetCursorPosition(positionX, positionY); positionY++; if (i + 1 == content.Count)//если последний элемент дерева, то рисуем завершающую закорючку { Console.Write(TreeLines.DownLast); } else//иначе продолжающаяся закорючка. В этом случае будет понятно, что существует дополнительная страница { Console.Write(TreeLines.DownContinue); } Console.Write(TreeLines.DoubleRight); if (content[i] is DirectoryInfo) { Console.ForegroundColor = textColor; } else { Console.ForegroundColor = fileColor; } Console.Write("{0, -70}", content[i].Name); Console.ForegroundColor = textColor; if (content[i] is DirectoryInfo) { /*try * { * string[] directories = Directory.GetDirectories(content[i].FullName); * //если в конкретной папке есть подпапки, помечаем её '[+]', чтобы указать, что есть смысл её просматривать: * if (directories.Length != 0) * { * Console.ForegroundColor = warningColor; * Console.WriteLine("[+]"); * } * } * catch (Exception) * { * Console.Write("\n"); * continue; * }*/ Console.ForegroundColor = textColor; Console.Write("{0, -15}", "<ПАПКА>"); } else if (content[i] is FileInfo) { Console.ForegroundColor = textColor; string memSize; try { memSize = ToPrettySize(((FileInfo)content[i]).Length); } catch (Exception) { memSize = "0"; } //для более читабельного вывода, дополняем строку проблеми string sep = new string(' ', 7 - memSize.Length); memSize = sep + memSize; Console.Write("{0, -15}", memSize); } Console.Write("{0, -5}", content[i].LastAccessTime.ToString("dd.MM.yyyy")); Console.Write("\t"); //вывод атрибутов if ((content[i].Attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly) { Console.Write("r"); } else { Console.Write("."); } if ((content[i].Attributes & FileAttributes.Archive) == FileAttributes.Archive) { Console.Write("a"); } else { Console.Write("."); } if ((content[i].Attributes & FileAttributes.System) == FileAttributes.System) { Console.Write("s"); } else { Console.Write("."); } if ((content[i].Attributes & FileAttributes.Hidden) == FileAttributes.Hidden) { Console.Write("h"); } else { Console.Write("."); } // Console.Write("{0, 0}", content[i].Attributes.ToString()); Console.Write("\n"); if (positionY > Configuration.ElementsOnPage) { break; } } if (rootFolder != CurrentFolder)//делаем эту проверку, чтобы не перерасчитывать общий объем папки { PrintInformation(rootFolder, content); } CurrentFolder = rootFolder; }