public NFSFolder Copy()
        {
            var folder = new NFSFolder(this.Index, this.Name);

            folder.files.AddRange(this.files.Select(file =>
                                                    new NFSFile(file.Filename, file.Extension, folder, file.Index, file.Order, file.Name, file.Size)));
            folder.folders.AddRange(this.folders.Select(item => item.Copy()));

            return(folder);
        }
Example #2
0
        public NFSFile(string filename, string extension, NFSFolder folder, int index, int order, string name, long size)
            : base(index, order, name, size)
        {
            if (folder == null)
            {
                throw new ArgumentNullException("folder");
            }

            this.filename  = filename;
            this.extension = extension;
            this.folder    = folder;
        }
        public void Add(NFSFolder folder)
        {
            if (folder == null)
            {
                throw new ArgumentNullException("folder");
            }

            if (this.folders.Contains(folder))
            {
                return;
            }

            folder.parentFolder = this;
            this.folders.Add(folder);
        }
        public static Task <NFSFolder> Load(IEnumerable <string> nfsLines, IProgressReporter reporter)
        {
            return(Task.Factory.StartNew(() =>
            {
                bool report = reporter != null;
                if (report)
                {
                    reporter.Start("read nfs folders");
                }

                var root = NFSFolder.CreateRoot();
                if (nfsLines == null || !nfsLines.Any())
                {
                    if (report)
                    {
                        reporter.Complete("nfs folders loaded");
                    }
                    return root;
                }

                var reader = new NFSFoldersReader(nfsLines);
                if (report)
                {
                    reader.ProgressChanged += (_, e) =>
                    {
                        reporter.Report(e.Percent, e.Status);
                    };
                }

                foreach (var folder in reader.Read())
                {
                    root.Add(folder);
                }

                if (report)
                {
                    reporter.Complete("nfs folders loaded");
                }
                return root;
            }));
        }
            private IEnumerable <NFSFolder> readLines()
            {
                var    lines   = this.nfsLines;
                int    total   = lines.Length;
                double current = 0;

                var folderRegex = this.folderRegex;
                var fileRegex   = this.fileRegex;

                int folderIndex = 0;
                int fileIndex   = 0;

                NFSFolder currentFolder      = null;
                string    previousFolderName = null;
                string    previousFileName   = null;

                foreach (var line in lines)
                {
                    raiseProgressChanged(current++ / total, string.Format("reading \"{0}\"", line));

                    var folderMatch = folderRegex.Match(line);
                    if (folderMatch.Success)
                    {
                        string folderName = folderMatch.Groups["folder"].Value;

                        if (string.Equals(previousFolderName, folderName, StringComparison.OrdinalIgnoreCase))
                        {
                            continue;
                        }
                        previousFolderName = folderName;

                        currentFolder = new NFSFolder(folderIndex++, folderName);
                        yield return(currentFolder);

                        previousFileName = null;
                        fileIndex        = 0;

                        continue;
                    }

                    var fileMatch = fileRegex.Match(line);
                    if (fileMatch.Success)
                    {
                        var groups = fileMatch.Groups;

                        string name      = groups["file"].Value;
                        string filename  = groups["filename"].Value;
                        string extension = groups["extension"].Value;
                        long   size;
                        long.TryParse(groups["size"].Value, out size);
                        int order = getFileOrder(name, size);

                        //if there are two same file in same folder, unpack first one will get an empty file.
                        if (string.Equals(previousFileName, name, StringComparison.OrdinalIgnoreCase))
                        {
                            currentFolder.RemoveLastFile();
                        }
                        else
                        {
                            previousFileName = name;
                        }

                        var file = new NFSFile(filename, extension, currentFolder, fileIndex++, order, name, size);
                        currentFolder.Add(file);
                        continue;
                    }
                }
            }