예제 #1
0
        private void UpdateFullName()
        {
            D2pDirectory current = this;

            this.FullName = current.Name;
            while (current.Parent != null)
            {
                this.FullName = this.FullName.Insert(0, current.Parent.Name + "\\");
                current       = current.Parent;
            }
        }
예제 #2
0
 private void InternalRemoveDirectories(D2pEntry entry)
 {
     for (D2pDirectory current = entry.Directory; current != null; current = current.Parent)
     {
         current.Entries.Remove(entry);
         if (current.Parent != null && current.Entries.Count == 0)
         {
             current.Parent.Directories.Remove(current);
         }
         else
         {
             if (current.IsRoot && current.Entries.Count == 0)
             {
                 this.m_rootDirectories.Remove(current);
             }
         }
     }
 }
예제 #3
0
        public void ExtractDirectory(string directoryName, string destination)
        {
            if (!this.HasDirectory(directoryName))
            {
                throw new InvalidOperationException(string.Format("Directory {0} does not exist", directoryName));
            }
            D2pDirectory directory = this.TryGetDirectory(directoryName);

            if (!Directory.Exists(Path.GetDirectoryName(Path.Combine(destination, directory.FullName))))
            {
                Directory.CreateDirectory(Path.GetDirectoryName(Path.Combine(destination, directory.FullName)));
            }
            foreach (D2pEntry entry in directory.Entries)
            {
                this.ExtractFile(entry.FullFileName, Path.Combine(destination, entry.FullFileName), false);
            }
            foreach (D2pDirectory pDirectory in directory.Directories)
            {
                this.ExtractDirectory(pDirectory.FullName, destination);
            }
        }
예제 #4
0
        public D2pDirectory[] GetDirectoriesTree(string directory)
        {
            List <D2pDirectory> result = new List <D2pDirectory>();

            string[] directoriesName = directory.Split(new char[]
            {
                '/',
                '\\'
            }, StringSplitOptions.RemoveEmptyEntries);
            D2pDirectory[] result2;
            if (directoriesName.Length == 0)
            {
                result2 = new D2pDirectory[0];
            }
            else
            {
                D2pDirectory current = this.m_rootDirectories.SingleOrDefault((D2pDirectory entry) => entry.Name == directoriesName[0]);
                if (current == null)
                {
                    result2 = new D2pDirectory[0];
                }
                else
                {
                    result.Add(current);
                    foreach (string dir in directoriesName.Skip(1))
                    {
                        if (!current.HasDirectory(dir))
                        {
                            result2 = result.ToArray();
                            return(result2);
                        }
                        current = current.TryGetDirectory(dir);
                        result.Add(current);
                    }
                    result2 = result.ToArray();
                }
            }
            return(result2);
        }
예제 #5
0
        public D2pDirectory TryGetDirectory(string directory)
        {
            string[] directoriesName = directory.Split(new char[]
            {
                '/',
                '\\'
            }, StringSplitOptions.RemoveEmptyEntries);
            D2pDirectory result;

            if (directoriesName.Length == 0)
            {
                result = null;
            }
            else
            {
                D2pDirectory current = this.m_rootDirectories.SingleOrDefault((D2pDirectory entry) => entry.Name == directoriesName[0]);
                if (current == null)
                {
                    result = null;
                }
                else
                {
                    foreach (string dir in directoriesName.Skip(1))
                    {
                        if (!current.HasDirectory(dir))
                        {
                            result = null;
                            return(result);
                        }
                        current = current.TryGetDirectory(dir);
                    }
                    result = current;
                }
            }
            return(result);
        }
예제 #6
0
 private void InternalAddDirectories(D2pEntry entry)
 {
     string[] directories = entry.GetDirectoriesName();
     if (directories.Length != 0)
     {
         D2pDirectory current = null;
         if (!this.HasDirectory(directories[0]))
         {
             current = new D2pDirectory(directories[0]);
             this.m_rootDirectories.Add(current);
         }
         else
         {
             current = this.TryGetDirectory(directories[0]);
         }
         current.Entries.Add(entry);
         foreach (string directory in directories.Skip(1))
         {
             if (!current.HasDirectory(directory))
             {
                 D2pDirectory dir = new D2pDirectory(directory)
                 {
                     Parent = current
                 };
                 current.Directories.Add(dir);
                 current = dir;
             }
             else
             {
                 current = current.TryGetDirectory(directory);
             }
             current.Entries.Add(entry);
         }
         entry.Directory = current;
     }
 }