/// <summary>
        /// Распаковывает IMG архив.
        /// В случае ошибки НЕ кидает дальше исключение, выводит ErrorMessage в лог.
        ///
        /// Все распакованные TXD файлы сначала копируются в outputPathPrefix/___txds/,
        /// потом распаковываются в outputPathPrefix
        /// </summary>
        /// <param name="imgPath">Путь к IMG архиву</param>
        /// <param name="outputPathPrefix">Папка, в которую проихводится распаковка. Должна существовать!</param>
        /// <param name="gtaVersion">Версия игры</param>
        public static void UnpackImg(string imgPath, string outputPathPrefix, GtaVersion gtaVersion)
        {
            try
            {
                if (!outputPathPrefix.EndsWith(Path.DirectorySeparatorChar.ToString()))
                {
                    outputPathPrefix += Path.DirectorySeparatorChar;
                }

                if (!Directory.Exists(outputPathPrefix + @"\___txds\\"))
                {
                    Directory.CreateDirectory(outputPathPrefix + @"\___txds\\");
                }

                using (Log.Instance.EnterStage("Unpacking IMG: " + imgPath))
                {
                    IMGArchive archive = new IMGArchive(imgPath, gtaVersion);
                    IEnumerable <FileProxy> entries = archive.Load();
                    foreach (var entry in entries)
                    {
                        byte[] data = entry.GetData();
                        if (entry.Name.ToLower().EndsWith(".txd"))
                        {
                            string path = outputPathPrefix + @"\___txds\\" + entry.Name;
                            if (!File.Exists(path))
                            {
                                using (FileStream fout = new FileStream(path, FileMode.Create))
                                    fout.Write(data, 0, data.Length);
                                UnpackTxd(path, outputPathPrefix);
                            }
                        }
                        else
                        {
                            string path = outputPathPrefix + entry.Name;
                            using (FileStream fout = new FileStream(path, FileMode.Create))
                                fout.Write(data, 0, data.Length);
                        }
                    }
                }
            }
            catch (Exception er)
            {
                Log.Instance.Print("Failed to unpack IMG. Exception occured: " + er.ToString());
            }
        }
        private List <FileProxy> LoadMainImgArchive(string path)
        {
            IMGArchive archive = new IMGArchive(path, gtaVersion);
            var        items   = archive.Load();
            var        result  = new List <FileProxy>();

            foreach (var item in items)
            {
                if (item.Name.EndsWith(".dff"))
                {
                    result.Add(item);
                }
                else if (item.Name.EndsWith(".txd"))
                {
                    TexturesStorage.Instance.AddTexturesArchive(item);
                }
            }

            return(result);
        }
        /// <summary>
        /// Распаковывает IMG архив.
        /// В случае ошибки НЕ кидает дальше исключение, выводит ErrorMessage в лог.
        /// 
        /// Все распакованные TXD файлы сначала копируются в outputPathPrefix/___txds/,
        /// потом распаковываются в outputPathPrefix
        /// </summary>
        /// <param name="imgPath">Путь к IMG архиву</param>
        /// <param name="outputPathPrefix">Папка, в которую проихводится распаковка. Должна существовать!</param>
        /// <param name="gtaVersion">Версия игры</param>
        public static void UnpackImg(string imgPath, string outputPathPrefix, GtaVersion gtaVersion)
        {
            try
             {
             if (!outputPathPrefix.EndsWith(Path.DirectorySeparatorChar.ToString()))
            outputPathPrefix += Path.DirectorySeparatorChar;

             if (!Directory.Exists(outputPathPrefix + @"\___txds\\"))
            Directory.CreateDirectory(outputPathPrefix + @"\___txds\\");

             using (Log.Instance.EnterStage("Unpacking IMG: " + imgPath))
             {
            IMGArchive archive = new IMGArchive(imgPath, gtaVersion);
            IEnumerable<FileProxy> entries = archive.Load();
            foreach (var entry in entries)
            {
               byte[] data = entry.GetData();
               if (entry.Name.ToLower().EndsWith(".txd"))
               {
                  string path = outputPathPrefix + @"\___txds\\" + entry.Name;
                  if (!File.Exists(path))
                  {
                     using (FileStream fout = new FileStream(path, FileMode.Create))
                        fout.Write(data, 0, data.Length);
                     UnpackTxd(path, outputPathPrefix);
                  }
               }
               else
               {
                  string path = outputPathPrefix + entry.Name;
                  using (FileStream fout = new FileStream(path, FileMode.Create))
                     fout.Write(data, 0, data.Length);
               }
            }
             }
             }
             catch (Exception er)
             {
            Log.Instance.Print("Failed to unpack IMG. Exception occured: " + er.ToString());
             }
        }
        private List<FileProxy> LoadMainImgArchive(string path)
        {
            IMGArchive archive = new IMGArchive(path, gtaVersion);
             var items = archive.Load();
             var result = new List<FileProxy>();

             foreach (var item in items)
             {
            if (item.Name.EndsWith(".dff"))
               result.Add(item);
            else if (item.Name.EndsWith(".txd"))
               TexturesStorage.Instance.AddTexturesArchive(item);
             }

             return result;
        }