added parallel proccessing of files
This commit is contained in:
parent
69a50326b2
commit
4e170efae2
1 changed files with 208 additions and 194 deletions
400
src/main.rs
400
src/main.rs
|
|
@ -12,6 +12,7 @@ mod extractors;
|
||||||
// Extensions
|
// Extensions
|
||||||
// }
|
// }
|
||||||
use std::{path::Path, fs};
|
use std::{path::Path, fs};
|
||||||
|
use rayon::prelude::*;
|
||||||
use extractors::{
|
use extractors::{
|
||||||
extract_zip,
|
extract_zip,
|
||||||
extract_rar,
|
extract_rar,
|
||||||
|
|
@ -43,228 +44,241 @@ fn main() {
|
||||||
fn run() -> i32 {
|
fn run() -> i32 {
|
||||||
let args: Vec<_> = std::env::args().collect();
|
let args: Vec<_> = std::env::args().collect();
|
||||||
if args.len() < 2 {
|
if args.len() < 2 {
|
||||||
println!("Usage: {} <filename>", args[0]);
|
println!("Usage: {} <filename1> [<filename2> ...]", args[0]);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
let fname = std::path::Path::new(&*args[1]);
|
|
||||||
if let Some(extension) = fname.extension().and_then(|s| s.to_str()) {
|
// Collect all input file paths from command line arguments
|
||||||
match extension {
|
let file_paths: Vec<_> = args.iter().skip(1).collect();
|
||||||
"zip" => {
|
|
||||||
if let Err(err) = extract_zip(&fname) {
|
// Use Rayon to parallelize the extraction process
|
||||||
println!("Error extracting ZIP: {}", err);
|
let result = file_paths.par_iter().map(|file_path| {
|
||||||
return 1;
|
let fname = std::path::Path::new(file_path);
|
||||||
}
|
if let Some(extension) = fname.extension().and_then(|s| s.to_str()) {
|
||||||
}
|
match extension {
|
||||||
"rar" => {
|
"zip" => {
|
||||||
if let Err(err) = extract_rar(&fname) {
|
if let Err(err) = extract_zip(&fname) {
|
||||||
println!("Error extracting RAR: {}", err);
|
println!("Error extracting ZIP: {}", err);
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"tar" => {
|
|
||||||
if let Err(err) = extract_tar(&fname) {
|
|
||||||
println!("Error extracting TAR: {}", err);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"xz" => {
|
|
||||||
let output_directory = Path::new("output_directory"); // Change this to your desired output directory
|
|
||||||
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;
|
return 1;
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
|
"rar" => {
|
||||||
|
if let Err(err) = extract_rar(&fname) {
|
||||||
|
println!("Error extracting RAR: {}", err);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"tar" => {
|
||||||
|
if let Err(err) = extract_tar(&fname) {
|
||||||
|
println!("Error extracting TAR: {}", err);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"xz" => {
|
||||||
|
let output_directory = Path::new("output_directory"); // Change this to your desired output directory
|
||||||
|
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" => {
|
||||||
|
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 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" => {
|
||||||
|
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 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" => {
|
||||||
|
let output_directory = Path::new("output_directory"); // Change this to your desired output directory
|
||||||
if let Err(err) = fs::create_dir_all(&output_directory) {
|
if let Err(err) = fs::create_dir_all(&output_directory) {
|
||||||
println!("Error creating output directory: {}", err);
|
println!("Error creating output directory: {}", err);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if let Err(err) = extract_lzma(&fname, &output_directory) {
|
if let Err(err) = extract_lzma(&fname, &output_directory) {
|
||||||
println!("Error extracting XZ: {}", err);
|
println!("Error extracting LZMA: {}", err);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
"7z" => {
|
||||||
"gz" => {
|
let output_directory = Path::new("output_directory"); // Change this to your desired output directory
|
||||||
let output_directory = Path::new("output_directory"); // Change this to your desired output directory
|
if let Err(err) = fs::create_dir_all(&output_directory) {
|
||||||
if let Err(err) = fs::create_dir_all(&output_directory) {
|
println!("Error creating output directory: {}", err);
|
||||||
println!("Error creating output directory: {}", 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;
|
return 1;
|
||||||
}
|
}
|
||||||
} else {
|
if let Err(err) = extract_7z(&fname, &output_directory) {
|
||||||
if let Err(err) = extract_gz(&fname, &output_directory) {
|
println!("Error extracting 7Z: {}", err);
|
||||||
println!("Error extracting GZ: {}", err);
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
"tbz2" => {
|
||||||
"bz2" => {
|
let output_directory = Path::new("output_directory"); // Change this to your desired output directory
|
||||||
let output_directory = Path::new("output_directory"); // Change this to your desired output directory
|
if let Err(err) = fs::create_dir_all(&output_directory) {
|
||||||
if let Err(err) = fs::create_dir_all(&output_directory) {
|
println!("Error creating output directory: {}", err);
|
||||||
println!("Error creating output directory: {}", err);
|
return 1;
|
||||||
return 1;
|
}
|
||||||
}
|
|
||||||
if fname.to_str().unwrap().ends_with(".tar.bz2") {
|
|
||||||
if let Err(err) = extract_tbz2(&fname,&output_directory) {
|
if let Err(err) = extract_tbz2(&fname,&output_directory) {
|
||||||
println!("Error extracting TBZ2: {}", err);
|
println!("Error extracting TBZ2: {}", err);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
if let Err(err) = extract_bz2(&fname, &output_directory) {
|
"txz" => {
|
||||||
println!("Error extracting BZ2: {}", err);
|
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;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
"tgz" => {
|
||||||
"lzma" => {
|
let output_directory = Path::new("output_directory"); // Change this to your desired output directory
|
||||||
let output_directory = Path::new("output_directory"); // Change this to your desired output directory
|
if let Err(err) = fs::create_dir_all(&output_directory) {
|
||||||
if let Err(err) = fs::create_dir_all(&output_directory) {
|
println!("Error creating output directory: {}", err);
|
||||||
println!("Error creating output directory: {}", err);
|
return 1;
|
||||||
return 1;
|
}
|
||||||
|
if let Err(err) = extract_tgz(&fname,&output_directory) {
|
||||||
|
println!("Error extracting TGZ: {}", err);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if let Err(err) = extract_lzma(&fname, &output_directory) {
|
/*
|
||||||
println!("Error extracting LZMA: {}", err);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"7z" => {
|
|
||||||
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_7z(&fname, &output_directory) {
|
|
||||||
println!("Error extracting 7Z: {}", err);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"tbz2" => {
|
|
||||||
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" => {
|
|
||||||
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" => {
|
|
||||||
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" => {
|
"arj" => {
|
||||||
if let Err(err) = extract_arj(&fname) {
|
if let Err(err) = extract_arj(&fname) {
|
||||||
println!("Error extracting ARJ: {}", err);
|
println!("Error extracting ARJ: {}", err);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"cab" => {
|
||||||
|
if let Err(err) = extract_cab(&fname) {
|
||||||
|
println!("Error extracting CAB: {}", err);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"chm" => {
|
||||||
|
if let Err(err) = extract_chm(&fname) {
|
||||||
|
println!("Error extracting CHM: {}", err);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"deb" => {
|
||||||
|
if let Err(err) = extract_deb(&fname) {
|
||||||
|
println!("Error extracting DEB: {}", err);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"dmg" => {
|
||||||
|
if let Err(err) = extract_dmg(&fname) {
|
||||||
|
println!("Error extracting DMG: {}", err);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"iso" => {
|
||||||
|
if let Err(err) = extract_iso(&fname) {
|
||||||
|
println!("Error extracting ISO: {}", err);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"lzh" => {
|
||||||
|
if let Err(err) = extract_lzh(&fname) {
|
||||||
|
println!("Error extracting LZH: {}", err);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"msi" => {
|
||||||
|
if let Err(err) = extract_msi(&fname) {
|
||||||
|
println!("Error extracting MSI: {}", err);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"rpm" => {
|
||||||
|
if let Err(err) = extract_rpm(&fname) {
|
||||||
|
println!("Error extracting RPM: {}", err);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"udf" => {
|
||||||
|
if let Err(err) = extract_udf(&fname) {
|
||||||
|
println!("Error extracting UDF: {}", err);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"wim" => {
|
||||||
|
if let Err(err) = extract_wim(&fname) {
|
||||||
|
println!("Error extracting WIM: {}", err);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"xar" => {
|
||||||
|
if let Err(err) = extract_udf(&fname) {
|
||||||
|
println!("Error extracting XAR: {}", err);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"exe" => {
|
||||||
|
if let Err(err) = extract_exe(&fname) {
|
||||||
|
println!("Error extracting EXE: {}", err);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
_ => {
|
||||||
|
println!("Unsupported file extension: {}", extension);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
"cab" => {
|
} else {
|
||||||
if let Err(err) = extract_cab(&fname) {
|
println!("Unknown file format: {:?}", file_path);
|
||||||
println!("Error extracting CAB: {}", err);
|
return 1;
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"chm" => {
|
|
||||||
if let Err(err) = extract_chm(&fname) {
|
|
||||||
println!("Error extracting CHM: {}", err);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"deb" => {
|
|
||||||
if let Err(err) = extract_deb(&fname) {
|
|
||||||
println!("Error extracting DEB: {}", err);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"dmg" => {
|
|
||||||
if let Err(err) = extract_dmg(&fname) {
|
|
||||||
println!("Error extracting DMG: {}", err);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"iso" => {
|
|
||||||
if let Err(err) = extract_iso(&fname) {
|
|
||||||
println!("Error extracting ISO: {}", err);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"lzh" => {
|
|
||||||
if let Err(err) = extract_lzh(&fname) {
|
|
||||||
println!("Error extracting LZH: {}", err);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"msi" => {
|
|
||||||
if let Err(err) = extract_msi(&fname) {
|
|
||||||
println!("Error extracting MSI: {}", err);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"rpm" => {
|
|
||||||
if let Err(err) = extract_rpm(&fname) {
|
|
||||||
println!("Error extracting RPM: {}", err);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"udf" => {
|
|
||||||
if let Err(err) = extract_udf(&fname) {
|
|
||||||
println!("Error extracting UDF: {}", err);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"wim" => {
|
|
||||||
if let Err(err) = extract_wim(&fname) {
|
|
||||||
println!("Error extracting WIM: {}", err);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"xar" => {
|
|
||||||
if let Err(err) = extract_udf(&fname) {
|
|
||||||
println!("Error extracting XAR: {}", err);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"exe" => {
|
|
||||||
if let Err(err) = extract_exe(&fname) {
|
|
||||||
println!("Error extracting EXE: {}", err);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
_ => {
|
|
||||||
println!("Unsupported file extension: {}", extension);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return 0;
|
0
|
||||||
}
|
}).reduce(|| 0, |a, b| a + b);
|
||||||
|
|
||||||
println!("Unknown file format");
|
if result == 0 {
|
||||||
return 1;
|
0
|
||||||
|
} else {
|
||||||
|
1
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue