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); }
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; } } }