我想在Golang中使用扩展名生成唯一的文件名。非常类似于ioutil.TempFile,只接受前缀。
这已在论坛https://groups.google.com/forum/#!topic/golang-nuts/PHgye3Hm2_0中多次出现,Go似乎非常希望不将该功能添加到TempFile。
那么建议的处理方法是什么?我应该只复制/粘贴TempFile代码并添加后缀参数吗?
答案 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())
}