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); }
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); } } } }