google/renameio
GitHub: google/renameio
renameio 是一个 Go 库,通过封装临时文件创建和原子重命名操作,确保文件写入过程中应用程序永远不会看到不完整或损坏的内容。
Stars: 679 | Forks: 33
[](https://github.com/google/renameio/actions?query=workflow%3ATest)
[](https://pkg.go.dev/github.com/google/renameio/v2)
[](https://goreportcard.com/report/github.com/google/renameio/v2)
`renameio` Go 包提供了一种以原子方式创建或替换文件或符号链接的方法。
## 原子性与持久性
`renameio` *仅*关注原子性,即确保应用程序永远不会看到意外的文件内容(写了一半的文件或 0 字节的文件)。
举个实际的例子,考虑 https://manpages.debian.org/:如果在网站更新时发生断电,我们可以接受丢失断电时正在渲染的 manpages。它们会在软件的后续运行中被添加。但是,我们绝不能接受 manpage 在任何情况下被 0 字节的文件替换。
## 本包的优势
解决该问题的一种简单方法是创建一个临时文件,然后调用 `os.Rename()`。然而,存在许多细节问题,使得难以确定正确的操作顺序:
* 发生错误时应删除临时文件,但如果重命名成功,则不应尝试删除,因为可能已经使用相同的名称创建了新文件。这使得一次性的 `defer os.Remove(t.Name())` 变得不够用;必须保持状态。
* 临时文件必须在同一文件系统(相同的挂载点)上创建才能使重命名生效,但仍应遵守 TMPDIR 环境变量,例如,将临时文件定向到 webserver 文档根目录之外的单独目录中,且位于同一文件系统上。
* 在 POSIX 操作系统上,必须使用
[`fsync`](https://manpages.debian.org/stretch/manpages-dev/fsync.2) 系统调用来确保 `os.Rename()` 调用不会产生 0 长度的文件。
本包试图正确处理所有这些细节,提供了一个直观且灵活的 API,并满足了需要高性能的使用场景。
## v2 中的主要更改
在主版本 renameio/v2 中,`renameio.WriteFile` 更改了处理权限的方式。在第 2 版之前,文件是使用传递给函数的权限创建的,而忽略了
[umask](https://en.wikipedia.org/wiki/Umask)。从第 2 版开始,这些权限会进一步被进程的 umask(通常是用户的首选 umask)所修改。
如果你依赖于 umask 被忽略的特性,在升级到 v2 时,请在你的 `renameio.WriteFile` 调用中添加 `renameio.IgnoreUmask()` 选项。
## 免责声明
这不是一个官方的 Google 产品(实验性的或其他),它只是恰好由 Google 拥有的代码。
本项目与 Go 项目无关。
标签:Bing搜索, EVTX分析, 日志审计