Esempio n. 1
0
        protected static void ListFilesCube(object obj)
        {
            RCAsyncState state = (RCAsyncState)obj;
            ListArgs     args  = (ListArgs)state.Other;

            try
            {
                RCCube         result   = new RCCube(new RCArray <string> ("S"));
                Queue <string> todo     = new Queue <string> ();
                string         top      = args.Path;
                string[]       topParts = top.Split(Path.DirectorySeparatorChar);
                int            startPart;
                RCSymbolScalar prefix;
                if (args.Spec != null)
                {
                    startPart = (int)(topParts.Length - args.Spec.Length) + 1;
                    prefix    = RCSymbolScalar.From(args.Spec.Part(0));
                }
                else
                {
                    startPart = 1;
                    prefix    = RCSymbolScalar.From(topParts[0]);
                }
                todo.Enqueue(top);
                while (todo.Count > 0)
                {
                    string   path  = todo.Dequeue();
                    string[] files = Directory.GetFiles(path);
                    for (int i = 0; i < files.Length; ++i)
                    {
                        FileInfo file = new FileInfo(files[i]);
                        if (args.All || file.Name[0] != '.')
                        {
                            string []      parts  = files[i].Split(Path.DirectorySeparatorChar);
                            RCSymbolScalar symbol = RCSymbolScalar.From(startPart, prefix, parts);
                            result.WriteCell("name", symbol, file.Name);
                            result.WriteCell("size", symbol, file.Length);
                            result.WriteCell("type", symbol, "f");
                            result.WriteCell("ext", symbol, file.Extension);
                            result.WriteCell("access",
                                             symbol,
                                             new RCTimeScalar(file.LastAccessTime,
                                                              RCTimeType.Datetime));
                            result.WriteCell("write",
                                             symbol,
                                             new RCTimeScalar(file.LastWriteTime,
                                                              RCTimeType.Datetime));
                            result.Axis.Write(symbol);
                        }
                    }
                    RCArray <string> dirs = new RCArray <string> (Directory.GetDirectories(path));
                    for (int i = 0; i < dirs.Count; ++i)
                    {
                        DirectoryInfo dir = new DirectoryInfo(dirs[i]);
                        if (args.All || dir.Name[0] != '.')
                        {
                            string []      parts  = dirs[i].Split(Path.DirectorySeparatorChar);
                            RCSymbolScalar symbol = RCSymbolScalar.From(startPart, prefix, parts);
                            result.WriteCell("name", symbol, dir.Name);
                            result.WriteCell("type", symbol, "d");
                            result.WriteCell("access",
                                             symbol,
                                             new RCTimeScalar(dir.LastAccessTime,
                                                              RCTimeType.Datetime));
                            result.WriteCell("write",
                                             symbol,
                                             new RCTimeScalar(dir.LastWriteTime,
                                                              RCTimeType.Datetime));
                            result.Axis.Write(symbol);
                            if (args.Deep)
                            {
                                todo.Enqueue(dirs[i]);
                            }
                        }
                    }
                }
                state.Runner.Yield(state.Closure, result);
            }
            catch (DirectoryNotFoundException ex)
            {
                state.Runner.Finish(state.Closure,
                                    new RCException(state.Closure, RCErrors.File, ex.Message),
                                    1);
            }
            catch (Exception ex)
            {
                state.Runner.Report(state.Closure, ex);
            }
        }