Ejemplo n.º 1
0
        private DiskEntry PopulateFromDisk(IDataReader dr)
        {
            DiskEntry entry = new DiskEntry();

            entry.CreateDate = Convert.ToDateTime(dr["CreateDate"]);
            try
            {
                entry.DirectoryID   = Convert.ToInt32(dr["DirectoryID"]);
                entry.DirectoryName = dr["Name"].ToString();
            }
            catch
            {
                entry.DiskID   = Convert.ToInt32(dr["DiskID"]);
                entry.FileName = dr["FileName"].ToString();
            }
            entry.Path   = dr["Path"].ToString();
            entry.UserID = Convert.ToInt32(dr["UserID"]);
            return(entry);
        }
Ejemplo n.º 2
0
        public static void Main(string[] args)
        {
            bool showHelp       = false;
            bool overwriteFiles = false;
            bool verbose        = false;

            var options = new OptionSet()
            {
                { "o|overwrite", "overwrite existing files", v => overwriteFiles = v != null },
                { "v|verbose", "be verbose", v => verbose = v != null },
                { "h|help", "show this message and exit", v => showHelp = v != null },
            };

            List <string> extras;

            try
            {
                extras = options.Parse(args);
            }
            catch (OptionException e)
            {
                Console.Write("{0}: ", GetExecutableName());
                Console.WriteLine(e.Message);
                Console.WriteLine("Try `{0} --help' for more information.", GetExecutableName());
                return;
            }

            if (extras.Count < 1 || extras.Count > 2 || showHelp == true)
            {
                Console.WriteLine("Usage: {0} [OPTIONS]+ input_disk [output_dir]", GetExecutableName());
                Console.WriteLine();
                Console.WriteLine("Options:");
                options.WriteOptionDescriptions(Console.Out);
                return;
            }

            var inputPath  = Path.GetFullPath(extras[0]);
            var outputPath = extras.Count > 1 ? extras[1] : Path.ChangeExtension(inputPath, null) + "_unpack";

            using (var input = File.OpenRead(inputPath))
            {
                const Endian endian = Endian.Big;

                var entryCount = input.ReadValueU32(endian);
                var entries    = new DiskEntry[entryCount];
                for (uint i = 0; i < entryCount; i++)
                {
                    entries[i] = DiskEntry.Read(input, endian);
                }
                var totalDataSize    = input.ReadValueU32(endian);
                var baseDataPosition = input.Position;

                long current = 0;
                long total   = entries.Length;
                var  padding = total.ToString(CultureInfo.InvariantCulture).Length;

                var directorySeparator = Path.DirectorySeparatorChar.ToString();
                foreach (var entry in entries)
                {
                    current++;

                    var entryPath = entry.Path;
                    entryPath = entryPath.Replace('\\', Path.DirectorySeparatorChar);

                    var rootIndex = entryPath.IndexOf(':');
                    if (rootIndex >= 0)
                    {
                        var rootPath     = entryPath.Substring(0, rootIndex);
                        var relativePath = entryPath.Substring(rootIndex + 1);

                        if (relativePath.StartsWith(directorySeparator) == true)
                        {
                            relativePath = relativePath.Substring(directorySeparator.Length);
                        }

                        rootIndex = relativePath.IndexOf(':');
                        if (rootIndex >= 0)
                        {
                            throw new InvalidOperationException();
                        }

                        entryPath = Path.Combine($"[{rootPath}]", relativePath);
                    }

                    if (entryPath.StartsWith(directorySeparator) == true)
                    {
                        entryPath = entryPath.Substring(directorySeparator.Length);
                    }

                    entryPath = Path.Combine(outputPath, entryPath);
                    if (overwriteFiles == false && File.Exists(entryPath) == true)
                    {
                        continue;
                    }

                    if (verbose == true)
                    {
                        Console.WriteLine(
                            "[{0}/{1}] {2}",
                            current.ToString(CultureInfo.InvariantCulture).PadLeft(padding),
                            total,
                            entry.Path);
                    }

                    var entryDirectory = Path.GetDirectoryName(entryPath);
                    if (entryDirectory != null)
                    {
                        Directory.CreateDirectory(entryDirectory);
                    }

                    using (var output = File.Create(entryPath))
                    {
                        input.Seek(baseDataPosition + entry.DataOffset, SeekOrigin.Begin);
                        output.WriteFromStream(input, (int)entry.DataSize);
                    }
                }
            }
        }