diff --git a/src/extractors.rs b/src/extractors.rs index d8e59c7..664e967 100644 --- a/src/extractors.rs +++ b/src/extractors.rs @@ -172,9 +172,91 @@ pub fn extract_7z(input_path: &Path, output_directory: &Path) -> Result<(), io:: Ok(()) } - // pub fn extract_tbz2(){} - // pub fn extract_tgz(){} - // pub fn extract_txz(){} +pub fn extract_tbz2(input_path: &Path, output_directory: &Path) -> Result<(), io::Error> { + // Open the input TBZ2 file + let input_file = File::open(input_path)?; + + // Create a BZ2 decompression reader + let bz2_reader = BzDecoder::new(input_file); + + // Create a Tar archive reader + let mut archive = tar::Archive::new(bz2_reader); + + for entry in archive.entries()? { + let mut entry = entry?; + let entry_path = entry.path()?; + let full_path = output_directory.join(entry_path); + + if entry.header().entry_type().is_dir() { + fs::create_dir_all(&full_path)?; + } else { + fs::create_dir_all(&full_path.parent().unwrap())?; + + let mut file = fs::File::create(&full_path)?; + io::copy(&mut entry, &mut file)?; + } + } + + Ok(()) +} + +pub fn extract_tgz(input_path: &Path, output_directory: &Path) -> Result<(), io::Error> { + // Open the input TGZ file + let input_file = File::open(input_path)?; + + // Create a GZ decompression reader + let mut decompressor = GzDecoder::new(input_file); + + // Create a Tar archive reader + let mut archive = tar::Archive::new(&mut decompressor); + + for entry in archive.entries()? { + let mut entry = entry?; + let entry_path = entry.path()?; + let full_path = output_directory.join(entry_path); + + if entry.header().entry_type().is_dir() { + fs::create_dir_all(&full_path)?; + } else { + fs::create_dir_all(&full_path.parent().unwrap())?; + + let mut file = fs::File::create(&full_path)?; + io::copy(&mut entry, &mut file)?; + } + } + + Ok(()) +} + +pub fn extract_txz(input_path: &Path, output_directory: &Path) -> Result<(), io::Error> { + // Open the input TXZ file + let input_file = File::open(input_path)?; + + // Create an XZ decompression reader + let mut decompressor = LzmaReader::new_decompressor(input_file) + .map_err(|err| io::Error::new(io::ErrorKind::Other, err))?; + + // Create a Tar archive reader + let mut archive = tar::Archive::new(&mut decompressor); + + for entry in archive.entries()? { + let mut entry = entry?; + let entry_path = entry.path()?; + let full_path = output_directory.join(entry_path); + + if entry.header().entry_type().is_dir() { + fs::create_dir_all(&full_path)?; + } else { + fs::create_dir_all(&full_path.parent().unwrap())?; + + let mut file = fs::File::create(&full_path)?; + io::copy(&mut entry, &mut file)?; + } + } + + Ok(()) +} + // pub fn extract_arj(){} // pub fn extract_cab(){} // pub fn extract_chm(){} diff --git a/src/main.rs b/src/main.rs index 7d920d6..f9ac554 100644 --- a/src/main.rs +++ b/src/main.rs @@ -19,10 +19,9 @@ use extractors::{ extract_tar, extract_lzma, extract_bz2, - // extract_tbz2, - // extract_tgz, - // extract_txz, - // extract_lzma, + extract_tbz2, + extract_tgz, + extract_txz, extract_gz, // extract_z, extract_7z, @@ -72,13 +71,20 @@ fn run() -> i32 { } "xz" => { let output_directory = Path::new("output_directory"); // Change this to your desired output directory - if let Err(err) = fs::create_dir_all(&output_directory) { - println!("Error creating output directory: {}", err); - return 1; - } - if let Err(err) = extract_lzma(&fname, &output_directory) { - println!("Error extracting XZ: {}", err); - return 1; + if fname.to_str().unwrap().ends_with(".tar.xz") { + if let Err(err) = extract_txz(&fname,&output_directory) { + println!("Error extracting TXZ: {}", err); + return 1; + } + } else { + if let Err(err) = fs::create_dir_all(&output_directory) { + println!("Error creating output directory: {}", err); + return 1; + } + if let Err(err) = extract_lzma(&fname, &output_directory) { + println!("Error extracting XZ: {}", err); + return 1; + } } } "gz" => { @@ -87,9 +93,16 @@ fn run() -> i32 { println!("Error creating output directory: {}", err); return 1; } - if let Err(err) = extract_gz(&fname, &output_directory) { - println!("Error extracting GZ: {}", err); - return 1; + if fname.to_str().unwrap().ends_with(".tar.gz") { + if let Err(err) = extract_tgz(&fname,&output_directory) { + println!("Error extracting TGZ: {}", err); + return 1; + } + } else { + if let Err(err) = extract_gz(&fname, &output_directory) { + println!("Error extracting GZ: {}", err); + return 1; + } } } "bz2" => { @@ -98,9 +111,16 @@ fn run() -> i32 { println!("Error creating output directory: {}", err); return 1; } - if let Err(err) = extract_bz2(&fname, &output_directory) { - println!("Error extracting BZ2: {}", err); - return 1; + if fname.to_str().unwrap().ends_with(".tar.bz2") { + if let Err(err) = extract_tbz2(&fname,&output_directory) { + println!("Error extracting TBZ2: {}", err); + return 1; + } + } else { + if let Err(err) = extract_bz2(&fname, &output_directory) { + println!("Error extracting BZ2: {}", err); + return 1; + } } } "lzma" => { @@ -125,25 +145,41 @@ fn run() -> i32 { return 1; } } - /* "tbz2" => { - if let Err(err) = extract_tbz2(&fname) { + let output_directory = Path::new("output_directory"); // Change this to your desired output directory + if let Err(err) = fs::create_dir_all(&output_directory) { + println!("Error creating output directory: {}", err); + return 1; + } + if let Err(err) = extract_tbz2(&fname,&output_directory) { println!("Error extracting TBZ2: {}", err); return 1; } } "txz" => { - if let Err(err) = extract_txz(&fname) { + let output_directory = Path::new("output_directory"); // Change this to your desired output directory + if let Err(err) = fs::create_dir_all(&output_directory) { + println!("Error creating output directory: {}", err); + return 1; + } + if let Err(err) = extract_txz(&fname,&output_directory) { println!("Error extracting TXZ: {}", err); return 1; } } "tgz" => { - if let Err(err) = extract_tgz(&fname) { + let output_directory = Path::new("output_directory"); // Change this to your desired output directory + if let Err(err) = fs::create_dir_all(&output_directory) { + println!("Error creating output directory: {}", err); + return 1; + } + if let Err(err) = extract_tgz(&fname,&output_directory) { println!("Error extracting TGZ: {}", err); return 1; } } + /* + "arj" => { if let Err(err) = extract_arj(&fname) { println!("Error extracting ARJ: {}", err);