예제 #1
0
        void Explode2KVol(string volFile, string dir)
        {
            try
            {
                using (FileStream vol2k = new FileStream(volFile, FileMode.Open, FileAccess.Read))
                {
                    List <GT2KVolEntry> files = new List <GT2KVolEntry>();
                    BinaryReader        br    = new BinaryReader(vol2k);
                    string name = br.ReadString();
                    while (!String.IsNullOrEmpty(name))
                    {
                        GT2KVolEntry file = new GT2KVolEntry();
                        file.name = name;
                        byte[] offsetArray = br.ReadBytes(4);
                        byte[] sizeArray   = br.ReadBytes(4);
                        if (BitConverter.IsLittleEndian)
                        {
                            Array.Reverse(offsetArray);
                            Array.Reverse(sizeArray);
                        }
                        file.offset = BitConverter.ToInt32(offsetArray, 0) * 0x800;
                        file.length = BitConverter.ToInt32(sizeArray, 0);
                        files.Add(file);
                        name = br.ReadString();
                    }
                    int           num      = files.Count;
                    char[]        pathSeps = new char[] { Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar };
                    StringBuilder sb       = new StringBuilder();
                    for (int i = 0; i < num; ++i)
                    {
                        vol2k.Seek(files[i].offset, SeekOrigin.Begin);
                        byte[] fileData = br.ReadBytes(files[i].length);
                        string fileName = files[i].name;

                        string[] pathParts = fileName.Split(pathSeps);
                        sb.AppendFormat("{0}{1}", dir, Path.DirectorySeparatorChar);
                        if (pathParts.Length > 1)
                        {
                            sb.AppendFormat("{0}{1}", pathParts[0], Path.DirectorySeparatorChar);
                            Directory.CreateDirectory(sb.ToString());
                            fileName = pathParts[1];
                        }
                        sb.Append(fileName);
                        File.WriteAllBytes(sb.ToString(), fileData);
                        statusText.Text = String.Format("Extracted {0}", fileName);
                        sb.Remove(0, sb.Length);
                    }
                }
            }
            catch (FileNotFoundException e)
            {
                MessageBox.Show(String.Format("GT2K Vol file couldn't be opened.\nError {0}", e.Message), "GT2K Vol Explode Error");
            }
        }
예제 #2
0
파일: GT2K.cs 프로젝트: adeyblue/GTVolTools
        static public void Explode2KVol(string[] args)
        {
            try
            {
                using (FileStream vol2k = new FileStream(args[1], FileMode.Open, FileAccess.Read))
                {
                    List <GT2KVolEntry> files = new List <GT2KVolEntry>();
                    BinaryReader        br    = new BinaryReader(vol2k);
                    string name = br.ReadString();
                    while (!String.IsNullOrEmpty(name))
                    {
                        GT2KVolEntry file = new GT2KVolEntry();
                        file.name = name;
                        byte[] offsetArray = br.ReadBytes(4);
                        byte[] sizeArray   = br.ReadBytes(4);
                        if (BitConverter.IsLittleEndian)
                        {
                            Array.Reverse(offsetArray);
                            Array.Reverse(sizeArray);
                        }
                        file.offset = BitConverter.ToInt32(offsetArray, 0) * 0x800;
                        file.length = BitConverter.ToInt32(sizeArray, 0);
                        files.Add(file);
                        name = br.ReadString();
                    }
                    int           num      = files.Count;
                    char[]        pathSeps = new char[] { Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar };
                    StringBuilder sb       = new StringBuilder();
                    for (int i = 0; i < num; ++i)
                    {
                        vol2k.Seek(files[i].offset, SeekOrigin.Begin);
                        byte[] fileData = br.ReadBytes(files[i].length);
                        string fileName = files[i].name;

                        string[] pathParts = fileName.Split(pathSeps);
                        sb.AppendFormat("{0}{1}", args[2], Path.DirectorySeparatorChar);
                        if (pathParts.Length > 1)
                        {
                            sb.AppendFormat("{0}{1}", pathParts[0], Path.DirectorySeparatorChar);
                            Directory.CreateDirectory(sb.ToString());
                            fileName = pathParts[1];
                        }
                        sb.Append(fileName);
                        File.WriteAllBytes(sb.ToString(), fileData);
                        sb.Remove(0, sb.Length);
                    }
                }
            }
            catch (FileNotFoundException)
            {
                Console.Error.WriteLine("VOL file doesn't exist or can't be accessed!");
            }
        }