功能失败时删除文件

问题描述

如果我运行此代码

package main
import "os"
func pass() bool { return false }

func main() {
   f,e := os.Create("file.txt")
   if e != nil {
      panic(e)
   }
   defer f.Close()
   if ! pass() {
      e := os.Remove("file.txt")
      if e != nil {
         panic(e)
      }
   }
}

我得到了这个结果:

The process cannot access the file because it is being used by another process.

如果我这样做,我会得到预期的结果:

defer f.Close()
if ! pass() {
   f.Close()
   e := os.Remove("file.txt")
   if e != nil {
      panic(e)
   }
}

但我想尽可能避免重复的 Close()文件总是 需要关闭,但如果某些功能失败,也需要删除。是更好的方法 可用于我正在尝试做什么?回复评论:该文件将是 从多个 HTTP 请求写入。它可能的第一个请求可以通过, 第二个请求失败。

解决方法

如果这种情况经常出现,那就创建一个辅助函数:

func nuke(f *os.File) {
   name := f.Name()
   f.Close()
   if err := os.Remove(name); err != nil {
      panic(err)
   }
}

像这样使用它:

func main() {
   f,e := os.Create("file.txt")
   if e != nil {
      panic(e)
   }
   defer f.Close()
   if ! pass() {
      nuke(f)
   }
}
,

这似乎是我想要的:

package main

import (
   "errors"
   "os"
)

func main() {
   f,err := os.Create("file.txt")
   if err != nil {
      panic(err)
   }
   defer func() {
      f.Close()
      if err != nil {
         os.Remove(f.Name())
      }
   }()
   err = errors.New("fail")
}

程序按原样关闭并删除文件。如果我删除最后一行, 仅关闭文件。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...