`os.O_APPEND` 和 `os.ModeAppend` 有什么区别?

Yuk*_*Ito 2 go

我们可以指定 offlagpermat os.OpenFile

他们有非常相似的选择,O_APPEND并且ModeAppend。他们之间有什么区别?

f, _ := os.OpenFile("access.log", os.O_APPEND|os.O_CREATE, os.ModeAppend|0644)
Run Code Online (Sandbox Code Playgroud)

Top*_*opo 5

指定flag系统调用中用于打开文件的标志,同时perm设置文件的文件模式。文件模式包括文件的权限和类型,例如。符号链接、目录等...

os.O_APPEND告诉底层操作系统,您对该文件处理程序执行的所有写入调用都应始终附加到文件,因此您无需设置偏移量即可写入文件的正确部分。

ModeAppend将文件模式设置为追加。这意味着只能通过附加到该文件来修改该文件,而不能通过重写文件内容来修改。具体细节取决于您使用的操作系统和文件系统。我相信计划 9 是通过忽略对文件的任何写入调用的偏移量并始终附加到它来实现的,而在 Linux 中,这意味着文件只能以附加模式打开以进行写入。我认为在大多数 Linux 发行版上,您需要成为 root 才能将文件模式设置为追加。

99.99%的情况下你只是想用它perm来设置文件权限rwx。在你的情况下,如果你想打开一个文件并附加到它,你应该使用:

// os.O_WRONLY tells the computer you are only going to writo to the file, not read
// os.O_CREATE tells the computer to create the file if it doesn't exist
// os.O_APPEND tells the computer to append to the end of the file instead of overwritting or truncating it
f, err := os.OpenFile("access.log", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644)
Run Code Online (Sandbox Code Playgroud)

您可能只需忽略返回错误即可os.OpenFile将示例放到网上,但您应该习惯于始终检查错误。你不知道有多少用户在开始使用 go 时遇到了麻烦,因为他们忽略了错误。有时是一些愚蠢且容易修复的事情,比如打字错误,但如果您忽略错误,您就不知道问题是什么。

您可以在此处阅读有关附加文件模式的更多信息。