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

Fyne框架SaveAs功能过滤失效:错误后缀仍创建空文件求助

问题

初学Fyne框架,编写了SaveAs功能保存编辑框内容,设置了仅允许保存.md后缀文件的过滤器。但点击SaveAs按钮输入1.txt并保存时,错误提示窗口弹出的同时,路径下仍生成了空的1.txt文件。调试时Goland崩溃,推测是Fyne版本更新导致问题。排查发现Fyne文件浏览器的默认Save按钮会先创建错误命名的文件,之后过滤器才拦截写入逻辑,导致空文件生成。咨询如何在保存前拦截该操作,是否需要修改Fyne源码?

代码如下:

func (app *config) saveAsFunc(win fyne.Window) func() {
    return func() {
        saveDialog := dialog.NewFileSave(func(write fyne.URIWriteCloser, err error) {
            if err != nil {
                dialog.ShowError(err, win)
                return
            }
            if write == nil {
                return
            }
            if !strings.HasSuffix(strings.ToLower(write.URI().String()), ".md") {
                dialog.ShowInformation("Error", "Please name your file end with .md", win)
                return
            }

            //保存文件
            write.Write([]byte(app.EditWidget.Text))
            app.CurrentFile = write.URI()

            defer write.Close()

            win.SetTitle(win.Title() + " - " + write.URI().Name())
            app.SaveMenuItem.Disabled = false
        }, win)
        saveDialog.SetFileName("untitled.md")
        saveDialog.SetFilter(filter)
        saveDialog.Show()
    }
}
解决方案
  • 无需修改Fyne源码,可通过两种方式提前拦截不符合后缀要求的保存操作:
    1. 前置文件名校验:在弹出系统文件保存对话框前,先弹出自定义输入框让用户输入文件名,先校验后缀是否符合.md要求。符合要求再调用Fyne的文件保存对话框并自动填入合规文件名;不符合直接提示错误,不触发系统文件对话框,从根源避免空文件生成。
    2. 创建后删除空文件:在检测到后缀不符合要求时,先关闭已创建的URIWriteCloser,再通过文件系统API删除已生成的空文件,之后弹出错误提示。修改后的示例代码如下:
func (app *config) saveAsFunc(win fyne.Window) func() {
    return func() {
        saveDialog := dialog.NewFileSave(func(write fyne.URIWriteCloser, err error) {
            if err != nil {
                dialog.ShowError(err, win)
                return
            }
            if write == nil {
                return
            }
            // 提前声明关闭文件句柄
            defer write.Close()
            
            filePath := write.URI().Path()
            if !strings.HasSuffix(strings.ToLower(filePath), ".md") {
                // 删除已生成的空文件
                os.Remove(filePath)
                dialog.ShowInformation("Error", "请将文件名设置为.md后缀", win)
                return
            }

            // 保存文件并处理写入错误
            _, writeErr := write.Write([]byte(app.EditWidget.Text))
            if writeErr != nil {
                dialog.ShowError(writeErr, win)
                return
            }
            app.CurrentFile = write.URI()

            win.SetTitle(win.Title() + " - " + write.URI().Name())
            app.SaveMenuItem.Disabled = false
        }, win)
        saveDialog.SetFileName("untitled.md")
        saveDialog.SetFilter(filter)
        saveDialog.Show()
    }
}
  • 注意:第二种方式依赖平台文件系统API,需确保os.Remove能正确访问目标路径;原代码中write.Write未处理错误,建议添加上以避免潜在异常。

内容的提问来源于stack exchange,提问作者王旭宏

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 17:20:27