需求:递归 原地 解压所有压缩文件
以前这种东西都用 python/shell 写
现在正在试着全面转向 rust 的技术栈 反正 rustup 安装也挺方便的(但比 go 还是麻烦了点
(好像设置 rust 和 rs 都没有代码高亮 凑活着看
use std::env;
use std::fs;
use std::io;
use std::path::{Path, PathBuf};
use std::process::Command;
fn unar_file(path: &Path) -> io::Result<()> {
println!("UNAR: {}", path.display());
let parent_dir = path.parent().unwrap();
let filename = path.file_name().unwrap();
let output = Command::new("unar")
.current_dir(parent_dir)
.arg("-s")
.arg("-d")
.arg(filename)
.output();
match output {
Ok(res) => {
if !res.status.success() {
eprintln!("Error processing compressed file {:?}: {}", path, String::from_utf8_lossy(&res.stderr));
return Err(io::ErrorKind::Other.into());
}
}
Err(e) => {
eprintln!("Failed to execute unar for {:?}: {}", path, e);
}
}
Ok(())
}
fn is_compressed(path: &Path) -> bool {
if let Some(ext) = path.extension() {
if let Some(ext) = ext.to_str() {
let ext = ext.to_lowercase();
return ext == "zip" || ext == "rar" || ext == "7z";
}
}
false
}
fn process_compressed_files(path: &Path) -> io::Result<()> {
if !path.is_dir() {
return Err(io::Error::new(io::ErrorKind::Other, "Not a directory"));
}
println!("Processing directory: {}", path.display());
for entry in fs::read_dir(path)? {
let entry_path = entry?.path();
if entry_path.is_dir() {
process_compressed_files(&entry_path)?;
} else if is_compressed(entry_path.as_path()) {
unar_file(&entry_path).expect("UNAR Error.");
}
}
Ok(())
}
fn main() -> io::Result<()> {
let args: Vec<String> = env::args().collect();
let start_path = if args.len() > 1 {
PathBuf::from(args[1].as_str())
} else {
PathBuf::from(".")
};
if start_path.is_file() {
return unar_file(&start_path);
}
process_compressed_files(&start_path)?;
Ok(())
}
不知道粗制滥造的代码有没有什么问题 Rust 大佬请指正~
1
yoiteshaw 108 天前 1
rust 实现了把用户可能会遇到的麻烦,提前转移到了开发者身上。之前写完 python 还需要用户安装 python 环境,即使用 nuitka 打包,也是需要给用户提供一堆 dll 和库文件。
写起来确实舒服。 |
2
Licsber OP @yoiteshaw #1 对我来说 比 Python 好的点就是 不用源码交付 环境不这么难装
况且心智负担 在业务场景我感觉不是什么大问题 对我来说很难用到高级特性 unsafe 不过这么看其实 go 才最符合需求 哈哈哈 直接超简单的跨平台编译 小工具特别顺手 但是 go 语法太简单了 有些人总喜欢要源码看看 就抄的很快 rust 让我更安心一点 (至少 会 rust 的程序员 水平应该不至于写不出我写的一些小工具 ((我不希望我的东西别人捡起来就能直接使用 这才是重点 hhhh |
4
Licsber OP |
5
shinyzhu 108 天前 via iPhone 3
我以为是那个“解压”
|
7
sunchuo 107 天前 1
没看明白。为啥不直接用 unar ?
|
8
Licsber OP |
10
momooc 107 天前 1
tar.gz 、tar 、gz 等压缩包也支持一下吧
|