在我的Go应用程序中,我不想直接写文件,而是想写一个临时文件,当所有事情都完成时,它会被重命名为最终文件。这是为了避免在应用程序崩溃时将部分写入的内容留在文件中。
目前我使用ioutil.TempFile,但问题是它创建的文件具有0600权限,而不是0666。因此,使用典型的umask值,可以获得0600权限,而不是预期的0644或0660。这不是一个问题,因为目标文件已经存在,因为我可以将临时文件上的权限修复为现有的权限,但如果文件不存在,那么我需要以某种方式推断当前的umask。
我想我可以复制ioutil.TempFile实现,将0666传递到os.OpenFile,但这听起来不太好。所以问题是有更好的方法吗?
3条答案
按热度按时间1dkrff031#
我不太明白你的问题。
临时文件 * 必须 * 以尽可能严格的权限创建,因为拥有它们的整个想法是为您的应用程序提供临时存储数据的 * 安全 * 方法,这些数据太大而无法容纳在内存中(或将生成的文件交给另一个进程)。(注意,在POSIX系统中,打开的文件被视为对其的实时引用,甚至习惯上在打开文件时立即删除文件,以便除了从创建它的进程写入之外,没有办法修改其数据。
所以在我看来,你试图用一个错误的解决方案来解决你的问题。
所以在你这样的情况下我会做的是:
1.创建一个与旧文件同名的文件,但附加了“.temp”后缀。
1.在那里写数据。
1.关闭,将其重命名为旧的。
如果您觉得使用固定的后缀是蹩脚的,那么您可以从
ioutil.TempFile()
中“窃取”选择一个唯一的非冲突文件名的实现。但我认为这是过度的。eit6fx6z2#
您可以使用
ioutil.TempDir
获取存储临时文件的文件夹,然后使用正确的权限自己创建文件。ecr0jaav3#
与问题的要求完全匹配,应该是: