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源码,可通过两种方式提前拦截不符合后缀要求的保存操作:
- 前置文件名校验:在弹出系统文件保存对话框前,先弹出自定义输入框让用户输入文件名,先校验后缀是否符合
.md要求。符合要求再调用Fyne的文件保存对话框并自动填入合规文件名;不符合直接提示错误,不触发系统文件对话框,从根源避免空文件生成。 - 创建后删除空文件:在检测到后缀不符合要求时,先关闭已创建的
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,提问作者王旭宏
相关产品推荐
相关产品推荐

