From e60c5583a0e5918bc0995a8b3bfad8d68f5a6cbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E7=94=9F=E6=9D=82=E7=89=A9=E6=88=BF?= <88823709+TC999@users.noreply.github.com> Date: Wed, 27 Nov 2024 01:01:24 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/scanner.rs | 24 ++++++++++++++---------- src/ui.rs | 22 ++++++++++++++-------- 2 files changed, 28 insertions(+), 18 deletions(-) diff --git a/src/scanner.rs b/src/scanner.rs index 45b2b23..1bc54f5 100644 --- a/src/scanner.rs +++ b/src/scanner.rs @@ -1,10 +1,9 @@ use dirs_next as dirs; use std::fs::{self}; -use std::sync::mpsc::Sender; +use std::sync::{mpsc::Sender, Arc, Mutex}; use std::thread; pub fn scan_appdata(target: &str, selected_target: &str, tx: Sender<(String, u64)>) { - // 获取应用数据路径 let appdata_dir = match dirs::data_dir() { Some(path) => match selected_target { "Local" => path.parent().unwrap().join("Local"), @@ -18,21 +17,23 @@ pub fn scan_appdata(target: &str, selected_target: &str, tx: Sender<(String, u64 println!("开始扫描文件夹: {}", target); println!("扫描的路径: {}", appdata_dir.display()); - // 确保路径存在 if appdata_dir.exists() { - // 创建一个新的线程来进行扫描 + // 克隆 tx,使其可以在不同线程中共享 + let tx = Arc::new(Mutex::new(tx)); + + // 创建新线程进行扫描 thread::spawn({ - let tx = tx.clone(); // 克隆发送者 + let appdata_dir = appdata_dir.clone(); + let tx = Arc::clone(&tx); // 克隆 Arc 中的 tx move || { let entries = match fs::read_dir(appdata_dir) { Ok(entries) => entries, Err(_) => { - eprintln!("无法读取目录: {}", appdata_dir.display()); + //eprintln!("无法读取目录: {}", appdata_dir.display()); return; } }; - // 遍历目录中的文件和文件夹 for entry in entries { if let Ok(entry) = entry { let path = entry.path(); @@ -42,8 +43,12 @@ pub fn scan_appdata(target: &str, selected_target: &str, tx: Sender<(String, u64 .unwrap_or("<未知文件夹>") .to_owned(); let size = calculate_folder_size(&path); - if tx.send((folder_name, size)).is_err() { - eprintln!("发送数据失败"); + + // 尝试发送数据 + let send_result = tx.lock().unwrap().send((folder_name, size)); + match send_result { + Ok(_) => {}, + Err(e) => eprintln!("发送数据失败: {}", e), // 输出错误信息 } } } @@ -53,7 +58,6 @@ pub fn scan_appdata(target: &str, selected_target: &str, tx: Sender<(String, u64 } } -// 计算文件夹的大小 fn calculate_folder_size(folder: &std::path::Path) -> u64 { let mut size = 0; if let Ok(entries) = fs::read_dir(folder) { diff --git a/src/ui.rs b/src/ui.rs index 89f4bd0..efbab77 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -3,12 +3,14 @@ use crate::confirmation; use crate::delete; use crate::scanner; use crate::utils; -use eframe::egui::{self, Grid, ScrollArea}; -use std::sync::{Arc, Mutex}; use std::path::PathBuf; use std::sync::mpsc; use std::sync::mpsc::Sender; use dirs_next as dirs; +use std::sync::{mpsc, Arc, Mutex}; +use std::thread; +use eframe::egui::{self, Grid, ScrollArea}; +use dirs_next as dirs; #[derive(Clone)] // 添加 Clone trait 以支持克隆 pub struct AppDataCleaner { @@ -57,16 +59,20 @@ impl AppDataCleaner { // 添加 start_scan 函数作为 AppDataCleaner 结构体的一部分 fn start_scan(&mut self) { - let (tx, rx) = mpsc::channel(); + let (tx, rx) = mpsc::channel(); // 创建通道 - // 将 `self` 包装在 `Arc>` 中,允许线程共享 - let appdata_cleaner: Arc> = Arc::new(Mutex::new(self.clone())); + // 将 `tx` 和 `rx` 包装在 Arc 中,使其在多个线程中安全共享 + let tx = Arc::new(Mutex::new(tx)); + let rx = Arc::new(Mutex::new(rx)); - std::thread::spawn({ - let appdata_cleaner = Arc::clone(&appdata_cleaner); // 克隆 `Arc`,允许线程访问 + // 创建线程进行扫描 + thread::spawn({ + let appdata_cleaner = Arc::clone(&self); // 克隆结构体,传入线程 + let tx = Arc::clone(&tx); // 克隆发送者 + let rx = Arc::clone(&rx); // 克隆接收者 move || { - let appdata_cleaner = appdata_cleaner.lock().unwrap(); // 获取锁 scanner::scan_appdata(&appdata_cleaner.selected_target, &appdata_cleaner.selected_target, tx); + // 可以在此处增加接收数据的逻辑,例如通过 rx.lock().unwrap().recv() 来接收数据 } }); }