google/renameio

GitHub: google/renameio

renameio 是一个 Go 库,通过封装临时文件创建和原子重命名操作,确保文件写入过程中应用程序永远不会看到不完整或损坏的内容。

Stars: 679 | Forks: 33

[![构建状态](https://static.pigsec.cn/wp-content/uploads/repos/cas/ce/ce733292a922c08274cf5a2096f8fa4cf01023bfa51a36ef6beecaaef371a9d9.svg)](https://github.com/google/renameio/actions?query=workflow%3ATest) [![PkgGoDev](https://pkg.go.dev/badge/github.com/google/renameio/v2)](https://pkg.go.dev/github.com/google/renameio/v2) [![Go Report Card](https://goreportcard.com/badge/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分析, 日志审计