utils: factorize reading file into vector

This commit is contained in:
dece 2020-05-09 21:59:19 +02:00
parent 992144801b
commit 052c061917
5 changed files with 24 additions and 23 deletions

View file

@ -8,7 +8,7 @@ use nom::Err::{Error as NomError, Failure as NomFailure};
use crate::name_hashes;
use crate::parsers::bhd;
use crate::unpackers::errors::UnpackError;
use crate::utils::fs as fs_utils;
use crate::utils::fs as utils_fs;
/// Parse a BHD file and extract its content from sister BDT.
///
@ -20,10 +20,7 @@ pub fn extract_bhd(
names: &HashMap<String, String>,
output_path: &str
) -> Result<(), UnpackError> {
let mut bhd_file = fs::File::open(bhd_path)?;
let file_len = bhd_file.metadata()?.len() as usize;
let mut bhd_data = vec![0u8; file_len];
bhd_file.read_exact(&mut bhd_data)?;
let bhd_data = utils_fs::open_file_to_vec(bhd_path)?;
let bhd = match bhd::parse(&bhd_data) {
Ok((_, bhd)) => bhd,
Err(NomError(e)) | Err(NomFailure(e)) => return Err(UnpackError::parsing_err("BHD", e.1)),
@ -45,7 +42,7 @@ fn extract_files(
output_path: &str,
) -> Result<(), io::Error> {
let output_path = path::Path::new(output_path);
fs_utils::ensure_dir_exists(output_path)?;
utils_fs::ensure_dir_exists(output_path)?;
for bucket in &bhd.buckets {
for entry in bucket {
@ -64,7 +61,7 @@ fn extract_files(
}
};
let file_path = output_path.join(rel_path);
fs_utils::ensure_dir_exists(file_path.parent().unwrap())?;
utils_fs::ensure_dir_exists(file_path.parent().unwrap())?;
let mut output_file = fs::File::create(file_path)?;
output_file.write_all(&data)?;
}

View file

@ -6,12 +6,10 @@ use nom::Err::{Error as NomError, Failure as NomFailure};
use crate::parsers::bhf;
use crate::unpackers::errors::UnpackError;
use crate::utils::fs as utils_fs;
pub fn extract_bhf(bhf_path: &str) -> Result<(), UnpackError> {
let mut bhf_file = fs::File::open(bhf_path)?;
let file_len = bhf_file.metadata()?.len() as usize;
let mut bhf_data = vec![0u8; file_len];
bhf_file.read_exact(&mut bhf_data)?;
let bhf_data = utils_fs::open_file_to_vec(bhf_path)?;
let bhf = match bhf::parse(&bhf_data) {
Ok((_, bhf)) => { bhf }
Err(NomError(e)) | Err(NomFailure(e)) => return Err(UnpackError::parsing_err("BHF", e.1)),
@ -22,6 +20,8 @@ pub fn extract_bhf(bhf_path: &str) -> Result<(), UnpackError> {
if bdt_path.is_none() {
return Err(UnpackError::Naming(format!("Can't find BDT for BHF: {}", bhf_path)))
}
Ok(())
}

View file

@ -1,12 +1,12 @@
use std::fs;
use std::io::{Read, Write};
use std::io::Write;
use std::path;
use nom::Err::{Error as NomError, Failure as NomFailure};
use crate::parsers::bnd;
use crate::unpackers::errors::UnpackError;
use crate::utils::fs as fs_utils;
use crate::utils::fs as utils_fs;
/// Extract BND file contents to disk.
///
@ -32,7 +32,7 @@ pub fn extract_bnd(
overwrite: bool
) -> Result<(), UnpackError> {
let output_dir = path::Path::new(output_dir);
fs_utils::ensure_dir_exists(output_dir)?;
utils_fs::ensure_dir_exists(output_dir)?;
for file_info in &bnd.file_infos {
// Extract all entries, print but ignore path errors.
match extract_bnd_entry(file_info, bnd_data, output_dir, overwrite) {
@ -83,10 +83,7 @@ fn extract_bnd_entry(
/// Wraps around `load_bnd` to load the BND from disk. It returns the
/// parsed BND metadata and the whole file as a byte vector.
pub fn load_bnd_file(bnd_path: &str) -> Result<(bnd::Bnd, Vec<u8>), UnpackError> {
let mut bnd_file = fs::File::open(bnd_path)?;
let file_len = bnd_file.metadata()?.len() as usize;
let mut bnd_data = vec![0u8; file_len];
bnd_file.read_exact(&mut bnd_data)?;
let bnd_data = utils_fs::open_file_to_vec(bnd_path)?;
Ok((load_bnd(&bnd_data)?, bnd_data))
}

View file

@ -6,6 +6,7 @@ use nom::Err::{Error as NomError, Failure as NomFailure};
use crate::parsers::dcx;
use crate::unpackers::errors::UnpackError;
use crate::utils::fs as utils_fs;
/// Extract DCX file content to disk.
pub fn extract_dcx(dcx_path: &str, output_path: &str) -> Result<(), UnpackError> {
@ -17,10 +18,7 @@ pub fn extract_dcx(dcx_path: &str, output_path: &str) -> Result<(), UnpackError>
/// Load a DCX file in memory along with its decompressed content.
pub fn load_dcx(dcx_path: &str) -> Result<(dcx::Dcx, Vec<u8>), UnpackError> {
let mut dcx_file = fs::File::open(dcx_path)?;
let file_len = dcx_file.metadata()?.len() as usize;
let mut dcx_data = vec![0u8; file_len];
dcx_file.read_exact(&mut dcx_data)?;
let dcx_data = utils_fs::open_file_to_vec(dcx_path)?;
let (data, dcx) = match dcx::parse(&dcx_data) {
Ok(result) => result,
Err(NomError(e)) | Err(NomFailure(e)) => return Err(UnpackError::parsing_err("DCX", e.1)),

View file

@ -1,5 +1,5 @@
use std::fs;
use std::io;
use std::io::{self, Read};
use std::path;
/// Ensure a directory exists, creating it with parents if necessary.
@ -24,6 +24,15 @@ pub fn strip_extension(path: &path::PathBuf) -> Option<path::PathBuf> {
Some(pb)
}
/// Open a binary file and read it to the end in a byte vector.
pub fn open_file_to_vec(path: &str) -> Result<Vec<u8>, io::Error> {
let mut file = fs::File::open(path)?;
let file_len = file.metadata()?.len() as usize;
let mut data = vec![0u8; file_len];
file.read_exact(&mut data)?;
Ok(data)
}
#[cfg(test)]
mod tests {
use super::*;