Golang生成带扩展名的唯一文件名

时间:2015-01-18 00:24:01

标签: go temporary-files

我想在Golang中使用扩展名生成唯一的文件名。非常类似于ioutil.TempFile,只接受前缀。

这已在论坛https://groups.google.com/forum/#!topic/golang-nuts/PHgye3Hm2_0中多次出现,Go似乎非常希望不将该功能添加到TempFile。

那么建议的处理方法是什么?我应该只复制/粘贴TempFile代码并添加后缀参数吗?

3 个答案:

答案 0 :(得分:4)

  

我应该只复制/粘贴TempFile代码并添加后缀参数吗?

这将是一种方式 其他方法是制作快速粗略的实施,如this project

// TempFileName generates a temporary filename for use in testing or whatever
func TempFileName(prefix, suffix string) string {
    randBytes := make([]byte, 16)
    rand.Read(randBytes)
    return filepath.Join(os.TempDir(), prefix+hex.EncodeToString(randBytes)+suffix)
}

如下面的James Henstridge comments,这是原始函数:

  

例如,该函数可以返回已存在的文件名。这样的API应该通过用O_CREAT | O_EXCL打开来创建文件,以确保在决定名称和创建文件之间没有其他人创建文件。

上面的粗略函数仅说明使用rand.Read()生成文件名。

但是其他检查都在io/ioutil/tempfile.go 3of3 suggests使用math.rand中的功能,而不是复制random number generator in io/ioutil/tempfile.go

答案 1 :(得分:2)

对于现在(2020年4月)以后会读此线程的人来说,ioutil.TempFile会处理前缀和后缀。

从其文档中:

TempFile在目录dir中创建一个新的临时文件, 打开文件进行读写,然后返回结果*os.File。 通过采用模式并添加随机数来生成文件名 字符串结尾。如果pattern包含“ *”,则随机字符串 替换最后一个“ *”。

这样,将“ prefix-*-suffix”作为pattern参数将产生预期的行为。

答案 2 :(得分:1)

从 Go 1.16(2021 年 2 月)开始,您可以使用 os.CreateTemp

package main
import "os"

func main() {
   f, e := os.CreateTemp("", "*.txt")
   if e != nil {
      panic(e)
   }
   defer f.Close()
   println(f.Name())
}

https://golang.org/pkg/os#CreateTemp