public void AddEntry(string path, ArchiveEntryBase entry) { Exceptions.CheckArgumentNullOrEmprty(path, "path"); Exceptions.CheckArgumentNull(entry, "entry"); if (ParentDirectory != null) { throw new Exception("Узел не является корневым."); } string[] partNames = path.ToLowerInvariant().Split(Path.DirectorySeparatorChar); if (partNames.Length < 2) { throw Exceptions.CreateException("Заданный путь не содержит корневого узла или имени файла: '{1}'", Name, path); } if (partNames.First() != Name) { throw Exceptions.CreateException("Узел '{0}' не явяется корневым для заданного пути: '{1}'", Name, path); } ArchiveDirectoryEntry dirNode = this; for (int i = 1; i < partNames.Length - 1; i++) { dirNode = dirNode.EnsureDirectoryExists(partNames[i]); } dirNode.AddEntry(entry); }
public static void Initialize(ArchiveInformation[] infos) { ArchiveDirectoryEntry root = new ArchiveDirectoryEntry("c:"); foreach (ArchiveInformation info in infos) { foreach (ArchiveFileEntry file in info.RootArchive.Expand()) { if (file.ParentArchive == null) { continue; } root.AddEntry(file.GetFullPath(), file); } } while (root.Childs.Count == 1) { ArchiveDirectoryEntry child = root.Childs.First().Value as ArchiveDirectoryEntry; if (child == null) { break; } root = child; } Infos = infos; Root = root; }
private ArchiveDirectoryEntry EnsureDirectoryExists(string partName) { ArchiveEntryBase dirEntry; if (!Childs.TryGetValue(partName, out dirEntry)) { dirEntry = new ArchiveDirectoryEntry(partName) { ParentDirectory = this }; Childs[partName] = dirEntry; } return((ArchiveDirectoryEntry)dirEntry); }
public ArchiveInformation(string filePath, long fileSize, DateTime fileTime, bool isOptimized) { Exceptions.CheckArgumentNullOrEmprty(filePath, "filePath"); if (fileSize < 0) { throw new ArgumentOutOfRangeException("fileSize", fileSize, "Размер файла не может быть отрицательным."); } FilePath = Path.ChangeExtension(filePath, null); FileSize = fileSize; FileTime = fileTime; IsOptimized = isOptimized; RootArchive = new ArchiveArchiveEntry(Path.GetFileNameWithoutExtension(FilePath)); RootDirectory = new ArchiveDirectoryEntry("c:"); }
public T FindChildEntry <T>(string path) where T : ArchiveEntryBase { Exceptions.CheckArgumentNullOrEmprty(path, "path"); string[] partNames = path.ToLowerInvariant().Split(Path.DirectorySeparatorChar); ArchiveDirectoryEntry dirNode = this; for (int i = 1; i < partNames.Length - 1; i++) { ArchiveDirectoryEntry child = dirNode.Childs.Values.OfType <ArchiveDirectoryEntry>().FirstOrDefault(c => c.Name == partNames[i]); if (child != null) { dirNode = child; } } return((T)dirNode.Childs.TryGetValue(partNames.Last())); }
public string GetFullPath() { var list = new List <string>(12) { Name }; ArchiveDirectoryEntry dir = ParentDirectory; while (dir != null) { list.Add(dir.Name); dir = dir.ParentDirectory; } list.Reverse(); list[0] += "\\"; return(Path.Combine(list.ToArray())); }
private void MoveFile(ArchiveFileEntry oldFile, ArchiveArchiveEntry newParent, ArchiveDirectoryEntry newDirectory) { ArchiveFileEntry newFile = oldFile.Clone(); { newFile.Compression = Compression.None; newFile.ContentOffset = newParent.CurrentPosition; SetCapacity(newFile); newParent.CurrentPosition += newFile.ContentCapacity; } newParent.AddEntry(newFile); newDirectory.AddEntry(oldFile.GetFullPath(), newFile); }
private void MoveContent(ArchiveArchiveEntry[] oldArchives, ArchiveArchiveEntry[] newArchives, ArchiveFileEntry[] newMetrics, ArchiveFileEntry[] newListing, ArchiveArchiveEntry newParent, ArchiveDirectoryEntry newDirectory) { for (int i = 0; i < oldArchives.Length; i++) { ArchiveArchiveEntry oldArchive = oldArchives[i]; ArchiveArchiveEntry newArchive = newArchives[i]; ArchiveFileEntry newContent = oldArchive.ContentEntry.Clone(); { newContent.Compression = Compression.None; newContent.ContentOffset = newParent.CurrentPosition; newArchive.ContentEntry = newContent; } newArchive.MetricsEntry = newMetrics[i]; newArchive.ListingEntry = newListing[i]; newArchive.ContentEntry = newContent; foreach (ArchiveFileEntry oldChild in oldArchive.Childs.OfType <ArchiveFileEntry>()) { MoveFile(oldChild, newArchive, newDirectory); } foreach (ArchiveArchiveEntry oldChild in oldArchive.Childs.OfType <ArchiveArchiveEntry>()) { MoveArchive(oldChild, newArchive, newDirectory); } newContent.UncompressedContentSize = newArchive.CurrentPosition; SetCapacity(newContent); newParent.CurrentPosition += newContent.ContentCapacity; } }
private void MoveArchive(ArchiveArchiveEntry sourceArchive, ArchiveArchiveEntry targetArchvie, ArchiveDirectoryEntry rootDirectory) { ArchiveArchiveEntry[] oldChildArchives = sourceArchive.Childs.OfType <ArchiveArchiveEntry>().ToArray(); ArchiveArchiveEntry[] archiveEntries = MoveArchive(oldChildArchives, targetArchvie); ArchiveFileEntry[] metricsEntries = MoveMetrics(oldChildArchives, archiveEntries, targetArchvie); ArchiveFileEntry[] listingEntries = MoveListing(oldChildArchives, archiveEntries, targetArchvie); MoveContent(oldChildArchives, archiveEntries, metricsEntries, listingEntries, targetArchvie, rootDirectory); }