Skip to content

Commit

Permalink
切换扫描对象
Browse files Browse the repository at this point in the history
  • Loading branch information
TC999 committed Nov 27, 2024
1 parent 74ce076 commit e521381
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 27 deletions.
45 changes: 24 additions & 21 deletions src/scanner.rs
Original file line number Diff line number Diff line change
@@ -1,32 +1,35 @@
use dirs_next as dirs;
use std::fs;
use std::sync::mpsc::Sender;
use std::thread;
use std::{fs, path::PathBuf};

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());
use dirs_next as dirs;

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();
pub fn scan_appdata(tx: Sender<(String, u64)>, folder_type: &str) {
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: &PathBuf) -> u64 {
let mut size = 0;
if let Ok(entries) = fs::read_dir(folder) {
for entry in entries.flatten() {
Expand Down
38 changes: 32 additions & 6 deletions src/ui.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,23 +4,31 @@ use crate::delete;
use crate::scanner;
use crate::utils;
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)>>,
}

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),
}
}
}
Expand Down Expand Up @@ -73,28 +81,46 @@ impl eframe::App for AppDataCleaner {
ui.close_menu();
}
});
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();
}
});
});

egui::CentralPanel::default().show(ctx, |ui| {
if ui.button("立即扫描").clicked() && !self.is_scanning {
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();

scanner::scan_appdata(tx, &folder_type);
}

while let Ok((folder, size)) = rx.recv() {
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

0 comments on commit e521381

Please sign in to comment.