You need to enable JavaScript to run this app. GTK+-3应用File-chooser最近列表不显示已打开文件解决方案咨询
优惠活动
大模型
产品
解决方案
定价
更多

GTK+-3应用File-chooser最近列表不显示已打开文件解决方案咨询

问题结论

是的,GTK 3的FileChooser组件默认不会自动将应用打开的文件写入系统最近文件列表,你需要手动调用GtkRecentManager系列接口完成记录。

实现步骤

  • 首先通过FileChooser组件获取用户选中文件的URI(不要直接用本地路径,走GFile转URI的标准流程可以避免跨平台、特殊字符路径出错)
  • 获取全局默认的GtkRecentManager实例
  • 调用添加接口将文件URI写入最近文件列表,推荐使用带完整参数的gtk_recent_manager_add_full()接口,可以标识出是你的应用打开的文件,方便桌面环境的最近列表分类展示。

代码示例(C语言)

// 假设dialog是你创建的FileChooser实例
if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
    GFile *selected_file = gtk_file_chooser_get_file(GTK_FILE_CHOOSER(dialog));
    gchar *file_uri = g_file_get_uri(selected_file);
    GtkRecentManager *recent_mgr = gtk_recent_manager_get_default();

    // 推荐带应用信息的完整添加方式
    gchar *mime_type = g_content_type_guess(file_uri, NULL, 0, NULL);
    gchar *app_exec = g_strjoin(" ", g_get_prgname(), "%u", NULL);
    
    GtkRecentData recent_data = {
        .mime_type = mime_type,
        .app_name = (gchar *)g_get_application_name(),
        .app_exec = app_exec,
        .is_private = FALSE
    };

    gtk_recent_manager_add_full(recent_mgr, file_uri, &recent_data);

    // 资源释放
    g_free(file_uri);
    g_free(mime_type);
    g_free(app_exec);
    g_object_unref(selected_file);
}
gtk_widget_destroy(dialog);

注意事项

  • 如果你用其他语言绑定(比如Python、Vala),对应GtkRecentManager的API逻辑完全一致,仅语法有区别
  • 沙箱打包(Flatpak、Snap)的应用需要额外申请最近文件读写权限,否则记录会写入失败
  • GTK内部会自动更新已有记录的打开时间戳,短时间内多次添加同一文件不会产生重复条目

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 08:24:02