using Tesses.VirtualFilesystem; using Tesses.VirtualFilesystem.Extensions; using Tesses.VirtualFilesystem.Filesystems; using System.Text; LocalFileSystem fs = new LocalFileSystem(); OverlayFilesystem overlay = new OverlayFilesystem(fs.GetSubdirFilesystem(Special.CurDir / "lower"),fs.GetSubdirFilesystem(Special.CurDir / "upper")); UnixPath path = Special.Root; int hasGone=0; Func Prompt = ()=>{ Console.Write(path.ToString()); Console.Write(": "); return Console.ReadLine(); }; Func ParseArgs = (argStr)=>{ List args = new List(); StringBuilder b= new StringBuilder(); bool isString=false; for(int i = 0;i0) { args.Add(b.ToString()); b.Clear(); } }else { b.Append(argStr[i]); } } } } if(b.Length >0) { args.Add(b.ToString()); b.Clear(); } return args.ToArray(); }; var read = Prompt(); while(read != null) { string[] _args = ParseArgs(read); switch(_args[0]) { case "exit": Environment.Exit(0); break; case "ls": await foreach(var files in overlay.EnumerateFileSystemEntriesAsync(_args.Length > 1 ? _args[1] : path)) { Console.WriteLine(files.Name); } break; case "cat": if(_args.Length > 1) { Console.Write(await overlay.ReadAllTextAsync(_args[1])); } break; case "cd": if(_args.Length > 1) path = _args[1]; break; case "mkdir": if(_args.Length > 1) { await overlay.CreateDirectoryAsync(path / _args[1]); } break; case "touch": if(_args.Length > 1) { UnixPath p = path / _args[1]; if(!await overlay.FileExistsAsync(p) && !await overlay.DirectoryExistsAsync(p) && !await overlay.SymlinkExistsAsync(p)) { await overlay.WriteAllTextAsync(p,""); } await overlay.SetLastWriteTimeAsync(p,DateTime.Now); } break; case "append": { UnixPath p = path / _args[1]; using(var srcF = await overlay.OpenAsync(p,FileMode.Append,FileAccess.Write,FileShare.Read)) { using(var sw = new StreamWriter(srcF)) { sw.WriteLine(_args[2]); } } } break; } read = Prompt(); }