Esempio n. 1
0
        public D2pDirectory TryGetDirectory(string directory)
        {
            string[] directoriesName = directory.Split(new[] { '/', '\\' }, StringSplitOptions.RemoveEmptyEntries);

            if (directoriesName.Length == 0)
            {
                return(null);
            }

            D2pDirectory current = null;

            m_rootDirectories.TryGetValue(directoriesName[0], out current);

            if (current == null)
            {
                return(null);
            }

            foreach (string dir in directoriesName.Skip(1))
            {
                if (!current.HasDirectory(dir))
                {
                    return(null);
                }

                current = current.TryGetDirectory(dir);
            }

            return(current);
        }
Esempio n. 2
0
        public D2pDirectory[] GetDirectoriesTree(string directory)
        {
            var result = new List <D2pDirectory>();

            string[] directoriesName = directory.Split(new[] { '/', '\\' }, StringSplitOptions.RemoveEmptyEntries);

            if (directoriesName.Length == 0)
            {
                return(new D2pDirectory[0]);
            }

            D2pDirectory current = null;

            m_rootDirectories.TryGetValue(directoriesName[0], out current);

            if (current == null)
            {
                return(new D2pDirectory[0]);
            }

            result.Add(current);

            foreach (string dir in directoriesName.Skip(1))
            {
                if (!current.HasDirectory(dir))
                {
                    return(result.ToArray());
                }

                current = current.TryGetDirectory(dir);
                result.Add(current);
            }

            return(result.ToArray());
        }
Esempio n. 3
0
        private void InternalAddDirectories(D2pEntry entry)
        {
            string[] directories = entry.GetDirectoriesName();

            if (directories.Length == 0)
            {
                return;
            }

            D2pDirectory current = null;

            if (!m_rootDirectories.ContainsKey(directories[0]))
            {
                m_rootDirectories.Add(directories[0], current = new D2pDirectory(this, directories[0]));
            }
            else
            {
                current = m_rootDirectories[directories[0]];
            }

            if (directories.Length == 1)
            {
                current.Entries.Add(entry);
            }

            for (int i = 1; i < directories.Length; i++)
            {
                string directory = directories[i];
                var    next      = current.TryGetDirectory(directory);
                if (next == null)
                {
                    var dir = new D2pDirectory(this, directory)
                    {
                        Parent = current
                    };
                    current.Directories.Add(directory, dir);

                    current = dir;
                }
                else
                {
                    current = next;
                }

                if (i == directories.Length - 1)
                {
                    current.Entries.Add(entry);
                }
            }

            entry.Directory = current;
        }
Esempio n. 4
0
        private void InternalRemoveDirectories(D2pEntry entry)
        {
            D2pDirectory current = entry.Directory;

            while (current != null)
            {
                current.Entries.Remove(entry);

                if (current.Parent != null && current.Entries.Count == 0)
                {
                    current.Parent.Directories.Remove(current.Name);
                }
                else if (current.IsRoot && current.Entries.Count == 0)
                {
                    m_rootDirectories.Remove(current.Name);
                }

                current = current.Parent;
            }
        }
Esempio n. 5
0
        public void ExtractDirectory(string directoryName, string destination)
        {
            if (!HasDirectory(directoryName))
            {
                throw new InvalidOperationException(string.Format("Directory {0} does not exist", directoryName));
            }

            D2pDirectory directory = TryGetDirectory(directoryName);

            if (!Directory.Exists(Path.Combine(destination, directory.FullName)))
            {
                Directory.CreateDirectory(Path.Combine(destination, directory.FullName));
            }

            foreach (D2pEntry entry in directory.Entries)
            {
                ExtractFile(entry.FullFileName, Path.Combine(destination, entry.FullFileName));
            }

            foreach (var pDirectory in directory.Directories)
            {
                ExtractDirectory(pDirectory.Value.FullName, destination);
            }
        }