static void Main(string[] args) { if (args.Length == 0 || args.Length > 2) { Usage(); System.Environment.Exit(1); } string infile = args[0]; if (!File.Exists(infile)) { Console.WriteLine("Unable to locate file '{0}'",infile); System.Environment.Exit(1); } string outdir = args.Length > 1 ? args[1] : Path.Combine(System.Environment.CurrentDirectory, Path.GetFileNameWithoutExtension(infile)) ; BSAArchive archive = new BSAArchive(infile); foreach (var name in archive.FileNames) { byte[] data = archive.GetFile(name); string fileName = Path.Combine(outdir, name); string pathName = Path.GetDirectoryName(fileName); try { Console.WriteLine(fileName); Directory.CreateDirectory(pathName); using (var file = File.Create(fileName, 4096)) { file.Write(data, 0, data.Length); } } catch (System.Exception ex) { Console.WriteLine("Unhandled exception while writing '{0}'", name); } } }
/// <summary> /// Retrieves the list of files in the specified BSA. /// </summary> /// <param name="p_strBsa">The BSA whose file listing is requested.</param> /// <returns>The list of files contained in the specified BSA.</returns> /// <exception cref="IllegalFilePathException">Thrown if <paramref name="p_strBsa"/> /// contains illegal characters or refers to a file outside of the Data directory.</exception> /// <exception cref="BSAArchive.BSALoadException">Thrown if the specified BSA cannot be loaded.</exception> public string[] GetBSAFileList(string p_strBsa) { if (Path.GetDirectoryName(p_strBsa).Length > 0) throw new IllegalFilePathException(p_strBsa); if (!m_dicBSAs.ContainsKey(p_strBsa)) m_dicBSAs[p_strBsa] = new BSAArchive(Path.Combine(GameMode.PluginDirectory, p_strBsa)); return (string[])m_dicBSAs[p_strBsa].FileNames.Clone(); }
/// <summary> /// Gets the specified file from the specified BSA. /// </summary> /// <param name="p_strBsa">The BSA from which to extract the specified file.</param> /// <param name="p_strFile">The files to extract form the specified BSA.</param> /// <returns>The data of the specified file.</returns> /// <exception cref="IllegalFilePathException">Thrown if <paramref name="p_strBsa"/> /// contains illegal characters or refers to a file outside of the Data directory, or /// if <paramref name="p_strFile"/> refers to an unsafe location.</exception> /// <exception cref="BSAArchive.BSALoadException">Thrown if the specified BSA cannot be loaded.</exception> public byte[] GetDataFileFromBSA(string p_strBsa, string p_strFile) { if (Path.GetDirectoryName(p_strBsa).Length > 0) throw new IllegalFilePathException(p_strBsa); string strLoweredBsa = p_strBsa.ToLowerInvariant(); if (!m_dicBSAs.ContainsKey(strLoweredBsa)) m_dicBSAs[strLoweredBsa] = new BSAArchive(Path.Combine(GameMode.PluginDirectory, strLoweredBsa)); return m_dicBSAs[strLoweredBsa].GetFile(p_strFile); }
internal BSAFileInfo(BSAArchive _bsa, int _offset, int _size) { bsa = _bsa; offset = _offset; size = _size; if ((size & (1 << 30)) != 0) { size ^= 1 << 30; compressed = !bsa.defaultCompressed; } else compressed = bsa.defaultCompressed; }
internal BSAFileInfo(BSAArchive _bsa, int _offset, int _size) { bsa = _bsa; offset = _offset; size = _size; if ((size & (1 << 30)) != 0) { size ^= 1 << 30; compressed = !bsa.defaultCompressed; } else { compressed = bsa.defaultCompressed; } }