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

时间:2018-05-06 23:32:31

标签: go

我们可以在os.OpenFile指定flagperm

他们有非常相似的选项,O_APPENDModeAppend。它们之间有什么区别?

f, _ := os.OpenFile("access.log", os.O_APPEND|os.O_CREATE, os.ModeAppend|0644)

1 个答案:

答案 0 :(得分:2)

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

os.O_APPEND告诉底层操作系统你在该文件处理程序上执行的所有写调用应该总是附加到文件中,这样你就不需要设置偏移量来写入文件的正确部分

ModeAppend设置要追加的文件模式。这意味着只能通过附加到此文件来修改此文件,而不能通过重写文件内容来修改。具体细节取决于您使用的操作系统和文件系统。我相信Plan 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)

您可能只会忽略os.OpenFile上的返回错误以使示例联机,但您应该习惯于始终检查错误。您不知道有多少用户在使用go时遇到麻烦,因为他们忽略了错误。有时候是一个愚蠢的东西,容易修复像拼写错误,但如果你忽略了错误,你就不知道问题是什么。

您可以阅读有关追加文件模式here的更多信息。