Skip to content

Commit

Permalink
Merge pull request #1 from TC999/dev
Browse files Browse the repository at this point in the history
合并更改
  • Loading branch information
TC999 authored Nov 27, 2024
2 parents 74ce076 + 0c32dcd commit ba63bb9
Show file tree
Hide file tree
Showing 7 changed files with 145 additions and 36 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -23,3 +23,6 @@ Cargo.lock
# Added by cargo

/target

# 日志文件
*.log
2 changes: 2 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,5 @@ eframe = "0.29.1"
dirs-next = "2.0"
tokio = { version = "1", features = ["full"] }
walkdir = "2.4"
log = "0.4"
simplelog = "0.12"
21 changes: 17 additions & 4 deletions src/delete.rs
Original file line number Diff line number Diff line change
@@ -1,18 +1,31 @@
use std::fs;
use std::path::Path;
use crate::logger;

pub fn delete_folder(folder_path: &str) -> Result<(), String> {
println!("Attempting to delete folder: {}", folder_path);
println!("尝试删除文件夹: {}", folder_path);
logger::log_info(&format!("尝试删除文件夹: {}", folder_path));

let path = Path::new(folder_path);

if !path.exists() {
return Err("Folder does not exist.".to_string());
println!("文件夹不存在.");
let error_msg = "文件夹不存在.".to_string();
logger::log_error(&error_msg);
return Err(error_msg);
}

if path.is_dir() {
fs::remove_dir_all(path).map_err(|e| e.to_string())
fs::remove_dir_all(path).map_err(|e| {
println!("删除失败: {}", e);
let error_msg = format!("删除失败: {}", e);
logger::log_error(&error_msg);
error_msg
})
} else {
Err("The path is not a directory.".to_string())
println!("路径不是目录.");
let error_msg = "路径不是目录.".to_string();
logger::log_error(&error_msg);
Err(error_msg)
}
}
22 changes: 22 additions & 0 deletions src/logger.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
use simplelog::{Config, LevelFilter, SimpleLogger, WriteLogger};
use std::fs::File;

pub fn init_logger(log_to_file: bool) {
if log_to_file {
let _ = WriteLogger::init(
LevelFilter::Info,
Config::default(),
File::create("appdata_cleaner.log").expect("无法创建日志文件"),
);
} else {
let _ = SimpleLogger::init(LevelFilter::Info, Config::default());
}
}

pub fn log_info(message: &str) {
log::info!("{}", message);
}

pub fn log_error(message: &str) {
log::error!("{}", message);
}
9 changes: 8 additions & 1 deletion src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,21 @@ mod delete;
mod scanner;
mod ui;
mod utils;
mod logger; // 引入 logger 模块

use ui::AppDataCleaner;

fn main() -> Result<(), eframe::Error> {
// 初始化日志
logger::init_logger(true); // true 表示日志记录到文件,false 表示只输出到控制台

let options = eframe::NativeOptions::default();
eframe::run_native(
"AppData Cleaner",
options,
Box::new(|_| Ok(Box::new(AppDataCleaner::default()))),
Box::new(|_| {
logger::log_info("应用程序启动");
Ok(Box::new(AppDataCleaner::default()))
}),
)
}
67 changes: 45 additions & 22 deletions src/scanner.rs
Original file line number Diff line number Diff line change
@@ -1,39 +1,62 @@
use std::sync::mpsc::Sender;
use std::thread;
use std::{fs, path::PathBuf};
use std::path::Path;

use dirs_next as dirs;
use std::fs;
use crate::logger; // 引入日志模块

pub fn scan_appdata(tx: std::sync::mpsc::Sender<(String, u64)>) {
if let Some(appdata_dir) = dirs::data_dir() {
// 正确使用 std::fs::read_dir 获取文件夹内容
let entries =
fs::read_dir(appdata_dir).unwrap_or_else(|_| fs::read_dir("/dev/null").unwrap());
pub fn scan_appdata(tx: Sender<(String, u64)>, folder_type: &str) {
println!("开始扫描 {} 类型的文件夹", folder_type);
// 记录日志
logger::log_info(&format!("开始扫描 {} 类型的文件夹", folder_type));

for entry in entries {
if let Ok(entry) = entry {
let path = entry.path();
if path.is_dir() {
// 获取文件夹的名称
let folder_name = path
.file_name()
.and_then(|os_str| os_str.to_str())
.unwrap_or("<未知文件夹>")
.to_owned();
// 根据 folder_type 确定要扫描的目录
let appdata_dir = match folder_type {
"Roaming" => dirs::data_dir(),
"Local" => dirs::cache_dir(),
"LocalLow" => Some(PathBuf::from("C:/Users/Default/AppData/LocalLow")), // 手动设置路径
_ => None,
};

let size = calculate_folder_size(&path); // 计算文件夹大小
tx.send((folder_name, size)).unwrap();
// 如果找到有效的目录,开始扫描
if let Some(appdata_dir) = appdata_dir {
thread::spawn(move || {
if let Ok(entries) = fs::read_dir(&appdata_dir) {
for entry in entries.flatten() {
if let Ok(metadata) = entry.metadata() {
if metadata.is_dir() {
let folder_name = entry.file_name().to_string_lossy().to_string();
let size = calculate_folder_size(&entry.path());
// 发送文件夹大小数据
tx.send((folder_name, size)).unwrap();
}
}
}
}
}
});
}
}

fn calculate_folder_size(folder: &std::path::Path) -> u64 {
// 计算文件夹的总大小(递归)
fn calculate_folder_size(folder: &Path) -> u64 {
let mut size = 0;

// 遍历文件夹中的所有条目
if let Ok(entries) = fs::read_dir(folder) {
for entry in entries.flatten() {
if let Ok(metadata) = entry.metadata() {
size += metadata.len();
let path = entry.path();
if path.is_dir() {
// 递归计算子文件夹的大小
size += calculate_folder_size(&path);
} else if path.is_file() {
// 计算文件大小
if let Ok(metadata) = entry.metadata() {
size += metadata.len();
}
}
}
}

size
}
57 changes: 48 additions & 9 deletions src/ui.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,24 +3,35 @@ use crate::confirmation;
use crate::delete;
use crate::scanner;
use crate::utils;
use crate::logger; // 导入 logger 模块
use eframe::egui::{self, Grid, ScrollArea};
use std::sync::mpsc::{Sender, Receiver};

pub struct AppDataCleaner {
is_scanning: bool,
current_folder: Option<String>,
folder_data: Vec<(String, u64)>,
show_about_window: bool, // 确保字段存在
confirm_delete: Option<(String, bool)>, // 保存要确认删除的文件夹状态
selected_appdata_folder: String, // 新增字段
tx: Option<Sender<(String, u64)>>,
rx: Option<Receiver<(String, u64)>>,
is_logging_enabled: bool, // 新增字段
}

impl Default for AppDataCleaner {
fn default() -> Self {
let (tx, rx) = std::sync::mpsc::channel();
Self {
is_scanning: false,
current_folder: None,
folder_data: vec![],
show_about_window: false, // 默认值
confirm_delete: None, // 初始化为 None
selected_appdata_folder: "Roaming".to_string(), // 默认值为 Roaming
tx: Some(tx),
rx: Some(rx),
is_logging_enabled: false, // 默认禁用日志
}
}
}
Expand Down Expand Up @@ -59,6 +70,7 @@ impl eframe::App for AppDataCleaner {
if result {
if let Err(err) = delete::delete_folder(&folder) {
eprintln!("删除失败: {}", err);
logger::log_info(&format!("删除失败: {}", err));
}
}
self.confirm_delete = None;
Expand All @@ -67,9 +79,24 @@ impl eframe::App for AppDataCleaner {

// 顶部菜单
egui::TopBottomPanel::top("menu_bar").show(ctx, |ui| {
ui.menu_button("菜单", |ui| {
if ui.button("关于").clicked() {
self.show_about_window = true; // 打开关于窗口
if ui.button("关于").clicked() {
self.show_about_window = true; // 打开关于窗口
ui.close_menu();
}
// 添加日志启用/禁用选项
ui.separator();
ui.checkbox(&mut self.is_logging_enabled, "启用日志");
ui.menu_button("切换文件夹", |ui| {
if ui.button("Roaming").clicked() {
self.selected_appdata_folder = "Roaming".to_string();
ui.close_menu();
}
if ui.button("Local").clicked() {
self.selected_appdata_folder = "Local".to_string();
ui.close_menu();
}
if ui.button("LocalLow").clicked() {
self.selected_appdata_folder = "LocalLow".to_string();
ui.close_menu();
}
});
Expand All @@ -80,21 +107,25 @@ impl eframe::App for AppDataCleaner {
self.is_scanning = true;
self.folder_data.clear();

let (tx, rx) = std::sync::mpsc::channel();
std::thread::spawn(move || scanner::scan_appdata(tx));
let tx = self.tx.clone().unwrap();
let folder_type = self.selected_appdata_folder.clone();

while let Ok((folder, size)) = rx.recv() {
scanner::scan_appdata(tx, &folder_type);
}

if let Some(rx) = &self.rx {
while let Ok((folder, size)) = rx.try_recv() {
self.folder_data.push((folder, size));
}

self.is_scanning = false;
self.current_folder = None;
}

if self.is_scanning {
ui.label("扫描中...");
} else {
ui.label("扫描完成");
}


ScrollArea::vertical().show(ui, |ui| {
Grid::new("folders_table").striped(true).show(ui, |ui| {
ui.label("文件夹");
Expand Down Expand Up @@ -129,5 +160,13 @@ impl eframe::App for AppDataCleaner {
if self.show_about_window {
about::show_about_window(ctx, &mut self.show_about_window);
}
// 根据日志开关决定是否记录日志
if self.is_logging_enabled {
// 启用日志记录
log::info!("日志系统已启用");
} else {
// 关闭日志记录
log::info!("日志系统已禁用");
}
}
}

0 comments on commit ba63bb9

Please sign in to comment.