diff --git a/FileSystem.cs b/FileSystem.cs index 676202d..e72c797 100644 --- a/FileSystem.cs +++ b/FileSystem.cs @@ -149,6 +149,79 @@ namespace CMLeonOS return fileList; } + public List GetDirectoryList(string path = ".") + { + string fullPath = GetFullPath(path); + List dirList = new List(); + + try + { + if (Directory.Exists(fullPath)) + { + var dirs = Directory.GetDirectories(fullPath); + foreach (var dir in dirs) + { + string dirName = Path.GetFileName(dir); + dirList.Add(dirName); + } + } + } + catch (Exception ex) + { + Console.WriteLine($"Error getting directory list: {ex.Message}"); + } + + return dirList; + } + + public List GetFullPathFileList(string path = ".") + { + string fullPath = GetFullPath(path); + List fileList = new List(); + + try + { + if (Directory.Exists(fullPath)) + { + var files = Directory.GetFiles(fullPath); + foreach (var file in files) + { + fileList.Add(file); + } + } + } + catch (Exception ex) + { + Console.WriteLine($"Error getting file list: {ex.Message}"); + } + + return fileList; + } + + public List GetFullPathDirectoryList(string path = ".") + { + string fullPath = GetFullPath(path); + List dirList = new List(); + + try + { + if (Directory.Exists(fullPath)) + { + var dirs = Directory.GetDirectories(fullPath); + foreach (var dir in dirs) + { + dirList.Add(dir); + } + } + } + catch (Exception ex) + { + Console.WriteLine($"Error getting directory list: {ex.Message}"); + } + + return dirList; + } + public void CreateFile(string path, string content = "") { string fullPath = GetFullPath(path); diff --git a/Nano.cs b/Nano.cs index 362e4e0..de3780c 100644 --- a/Nano.cs +++ b/Nano.cs @@ -661,7 +661,7 @@ namespace CMLeonOS Console.BackgroundColor = ConsoleColor.White; Console.ForegroundColor = ConsoleColor.Black; Console.SetCursorPosition(0, 0); - string text = " Nano Editor 1.2"; + string text = " CMLeonOS Nano Editor"; Console.WriteLine(text + new string(' ', consoleWidth - text.Length)); string displayName = path == null ? "New File" : System.IO.Path.GetFileName(path); diff --git a/Shell.cs b/Shell.cs index d5d5ffc..9f7f859 100644 --- a/Shell.cs +++ b/Shell.cs @@ -434,6 +434,9 @@ namespace CMLeonOS case "find": FindFile(args); break; + case "tree": + ShowTree(args); + break; case "getdisk": GetDiskInfo(); break; @@ -1324,6 +1327,80 @@ namespace CMLeonOS } } + private void ShowTree(string args) + { + string startPath = string.IsNullOrEmpty(args) ? "." : args; + string fullPath = fileSystem.GetFullPath(startPath); + + if (!System.IO.Directory.Exists(fullPath)) + { + ShowError($"Directory not found: {startPath}"); + return; + } + + try + { + Console.WriteLine(fullPath); + PrintDirectoryTree(fullPath, "", true); + } + catch (Exception ex) + { + ShowError($"Error displaying tree: {ex.Message}"); + } + } + + private void PrintDirectoryTree(string path, string prefix, bool isLast) + { + try + { + var dirs = fileSystem.GetFullPathDirectoryList(path); + var files = fileSystem.GetFullPathFileList(path); + + int totalItems = dirs.Count + files.Count; + int current = 0; + + foreach (var dir in dirs) + { + current++; + bool isLastItem = current == totalItems; + string connector = isLastItem ? "+-- " : "|-- "; + string newPrefix = prefix + (isLastItem ? " " : "| "); + + string dirName = System.IO.Path.GetFileName(dir); + Console.WriteLine($"{prefix}{connector}{dirName}/"); + + PrintDirectoryTree(dir, newPrefix, isLastItem); + } + + foreach (var file in files) + { + current++; + bool isLastItem = current == totalItems; + string connector = isLastItem ? "+-- " : "|-- "; + + string fileName = System.IO.Path.GetFileName(file); + Console.WriteLine($"{prefix}{connector}{fileName}"); + } + } + catch (System.IO.DirectoryNotFoundException) + { + ShowError($"Directory not found: {path}"); + } + // catch (System.IO.UnauthorizedAccessException) + // { + // ShowError($"Access denied to directory: {path}"); + // } + catch (Exception ex) + { + string errorMsg = ex.Message; + if (string.IsNullOrEmpty(errorMsg)) + { + errorMsg = $"Error type: {ex.GetType().Name}"; + } + ShowError($"Error reading directory {path}: {errorMsg}"); + } + } + private void GetDiskInfo() { Console.WriteLine("====================================");