You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tauri开发:如何通过自定义菜单唤起原生文件浏览器打开文件

在Tauri中通过自定义菜单项唤起原生文件浏览器选择并打开文件

要实现点击自定义的"Open"菜单项唤起原生文件浏览器,你需要使用Tauri封装的dialog模块API,它能直接调用系统原生的文件选择器,无需额外复杂实现。

步骤1:导入必要模块

先确保代码顶部导入所需的Tauri对话框模块和文件操作模块:

use tauri::api::dialog;
use std::fs;

步骤2:编写菜单事件处理逻辑

在on_menu_event的匹配分支中,调用dialog::open方法并处理用户选择的文件:

.on_menu_event(|event| match event.menu_item_id() {
    "open" => {
        // 唤起原生文件选择对话框
        dialog::open(
            Some(event.window()), // 关联当前窗口,使对话框以模态形式显示
            None, // 可选:设置默认打开的目录,传None则使用系统默认路径
            // 可选:设置文件类型过滤规则,示例为仅允许文本文件和所有文件
            Some("Text Files (*.txt);;All Files (*)"),
            // 处理用户选择结果的闭包
            move |file_path| {
                if let Some(path) = file_path {
                    // 这里添加文件处理逻辑,比如读取文件内容
                    match fs::read_to_string(&path) {
                        Ok(content) => {
                            println!("选中文件路径:{}", path.display());
                            println!("文件内容:{}", content);
                            // 你可以在这里将内容发送到前端页面,或执行其他业务操作
                        }
                        Err(e) => {
                            eprintln!("读取文件失败:{}", e);
                        }
                    }
                } else {
                    // 用户取消了文件选择
                    println!("用户取消文件选择");
                }
            },
        );
    }
    // 其他菜单项的匹配分支
    _ => {}
})

代码细节说明

  • dialog::open第一个参数传入窗口实例,确保对话框是模态的,会阻塞当前窗口的操作直到对话框关闭。
  • 第三个参数的文件过滤规则采用"显示名称 (*.扩展名);;另一组规则"的格式,不需要过滤时可以传None。
  • 最后一个闭包会在用户完成选择或取消选择时触发:
    • 用户选择文件后,file_path返回Some(PathBuf),可基于该路径进行读取、解析等操作。
    • 用户取消选择时,file_path返回None,可在这里处理取消逻辑。

完整菜单创建示例

整合菜单创建与事件处理的完整代码片段:

use tauri::{CustomMenuItem, Menu, MenuItem, Submenu, WindowMenuEvent};
use tauri::api::dialog;
use std::fs;

fn main() {
    // 创建自定义Open菜单项
    let open_item = CustomMenuItem::new("open".to_string(), "Open");
    // 构建File子菜单
    let file_menu = Submenu::new("File", Menu::new().add_item(open_item));

    // 构建应用主菜单
    let menu = Menu::new()
        .add_submenu(file_menu)
        .add_native_item(MenuItem::Quit);

    tauri::Builder::default()
        .menu(menu)
        .on_menu_event(|event| match event.menu_item_id() {
            "open" => {
                dialog::open(
                    Some(event.window()),
                    None,
                    Some("Text Files (*.txt);;All Files (*)"),
                    move |file_path| {
                        if let Some(path) = file_path {
                            match fs::read_to_string(&path) {
                                Ok(content) => {
                                    println!("选中文件:{}", path.display());
                                    println!("内容预览:{}", content);
                                }
                                Err(e) => eprintln!("读取错误:{}", e),
                            }
                        }
                    },
                );
            }
            _ => {}
        })
        .run(tauri::generate_context!())
        .expect("Tauri应用启动失败");
}

内容的提问来源于stack exchange,提问作者tnrich

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 15:41:03