protected override Variable Evaluate(ParsingScript script) { string dirname = (!script.StillValid() || script.Current == Constants.END_STATEMENT) ? Directory.GetCurrentDirectory() : Utils.GetToken(script, Constants.NEXT_OR_END_ARRAY); //List<Variable> results = Utils.GetPathnames(dirname); List <Variable> results = new List <Variable>(); int index = dirname.IndexOf('*'); if (index < 0 && !Directory.Exists(dirname) && !File.Exists(dirname)) { throw new ArgumentException("Directory [" + dirname + "] doesn't exist"); } string pattern = Constants.ALL_FILES; try { string dir = index < 0 ? Path.GetFullPath(dirname) : dirname; if (File.Exists(dir)) { FileInfo fi = new FileInfo(dir); Interpreter.Instance.AppendOutput(Utils.GetPathDetails(fi, fi.Name), true); results.Add(new Variable(fi.Name)); return(new Variable(results)); } // Special dealing if there is a pattern (only * is supported at the moment) if (index >= 0) { pattern = Path.GetFileName(dirname); if (index > 0) { string prefix = dirname.Substring(0, index); DirectoryInfo di = Directory.GetParent(prefix); dirname = di.FullName; } else { dirname = "."; } } dir = Path.GetFullPath(dirname); // First get contents of the directory (unless there is a pattern) DirectoryInfo dirInfo = new DirectoryInfo(dir); if (pattern == Constants.ALL_FILES) { Interpreter.Instance.AppendOutput(Utils.GetPathDetails(dirInfo, "."), true); if (dirInfo.Parent != null) { Interpreter.Instance.AppendOutput(Utils.GetPathDetails(dirInfo.Parent, ".."), true); } } // Then get contents of all of the files in the directory FileInfo[] fileNames = dirInfo.GetFiles(pattern); foreach (FileInfo fi in fileNames) { try { Interpreter.Instance.AppendOutput(Utils.GetPathDetails(fi, fi.Name), true); results.Add(new Variable(fi.Name)); } catch (Exception) { continue; } } // Then get contents of all of the subdirs in the directory DirectoryInfo[] dirInfos = dirInfo.GetDirectories(pattern); foreach (DirectoryInfo di in dirInfos) { try { Interpreter.Instance.AppendOutput(Utils.GetPathDetails(di, di.Name), true); results.Add(new Variable(di.Name)); } catch (Exception) { continue; } } } catch (Exception exc) { throw new ArgumentException("Couldn't list directory: " + exc.Message); } return(new Variable(results)); }