Пример #1
0
        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);
        }
Пример #2
0
        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;
        }
Пример #3
0
        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);
        }
Пример #4
0
        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:");
        }
Пример #5
0
        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()));
        }
Пример #6
0
        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()));
        }
Пример #7
0
        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);
        }
Пример #8
0
        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;
            }
        }
Пример #9
0
 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);
 }