程序完成,只需要添加图标和关闭CMD窗口即可

This commit is contained in:
iorebuild 2025-08-08 00:04:52 +08:00
parent bec0d21d20
commit 01b37916c1
3 changed files with 56 additions and 18 deletions

View File

@ -4,7 +4,7 @@ version = "1.0.0"
edition = "2024"
[dependencies]
tokio = "1.47.1"
tokio = { version = "1.47.1", features = ["full"] }
async-tftp = "0.3.6"
slint = "1.12.1"
rfd = "0.15.4"

View File

@ -14,6 +14,7 @@ export component MainWindow inherits Window {
callback StartTftp();
//停止回调
callback StopTftp();
//选择路径按钮
Rectangle {
height: 35px;
width: 95px;

View File

@ -2,38 +2,75 @@ use async_tftp::server::TftpServerBuilder;
use async_tftp::Result;
use rfd::FileDialog;
use slint::SharedString;
use std::error::Error;
// ?use smol::{prelude::*};
use std::path::PathBuf;
use tokio::task::{AbortHandle, JoinHandle};
use std::sync::{Arc, Mutex};
slint::include_modules!();
async fn StartTftpServer(Dir: &str) -> Result<()> {
println!("Start Tftp Server Dir With:{Dir}");
let tftpd = TftpServerBuilder::with_dir_ro(Dir)?.build().await?;
tftpd.serve().await?;
Ok(())
struct ServerState {
abort_handle: Option<AbortHandle>,
}
fn main() {
async fn start_tftp_server(dir: PathBuf) -> Result<(JoinHandle<()>, AbortHandle)> {
let task = tokio::spawn(async move {
println!("Starting TFTP server at: {:?}", dir);
let tftpd = TftpServerBuilder::with_dir_ro(&dir)
.expect("Failed to create server")
.build()
.await
.expect("Failed to bind socket");
if let Err(e) = tftpd.serve().await {
eprintln!("Server error: {}", e);
}
});
let abort_handle = task.abort_handle();
Ok((task, abort_handle))
}
#[tokio::main]
async fn main() {
let ui = MainWindow::new().unwrap();
let state = Arc::new(Mutex::new(ServerState { abort_handle: None }));
let folder_path = Arc::new(Mutex::new(String::new()));
let path_clone = folder_path.clone();
//选择路径按钮的回调函数
ui.on_BrowserFolder(move || {
let result = FileDialog::new()
.set_directory("/")
.pick_folder();
SharedString::from(
result.map(|p| p.to_string_lossy().into_owned())
.unwrap_or_default()
)
let path = result.map(|p| p.to_string_lossy().into_owned())
.unwrap_or_default();
*path_clone.lock().unwrap() = path.clone(); // 存储到变量
SharedString::from(path)
});
//启动按钮的回调函数
let state_clone = state.clone();
let path_clone = Arc::clone(&folder_path);
ui.on_StartTftp(move || {
// smol::spawn(StartTftpServer("C:/Users/anonymous/Desktop/Rust/VoiletTftp/target/release/")).detach();
// let Dir = PathBuf::from("C:/Users/anonymous/Desktop/Rust/VoiletTftp/target/release");
let dir = PathBuf::from(&*path_clone.lock().unwrap());
println!("{:?}",dir);
let state = state_clone.clone();
tokio::spawn(async move {
match start_tftp_server(dir).await {
Ok((_handle, abort_handle)) => {
println!("Server started");
// 存储 abort_handle 以便停止
state.lock().unwrap().abort_handle = Some(abort_handle);
}
Err(e) => eprintln!("Error: {}", e),
}
});
});
//停止按钮的回调函数
let state_clone = state.clone();
ui.on_StopTftp(move || {
if let Some(handle) = state_clone.lock().unwrap().abort_handle.take() {
handle.abort();
println!("Server stopped");
}
});
ui.run().unwrap();
}
//启动一个TFTP服务器帮我改写