为了账号安全,请及时绑定邮箱和手机立即绑定

查找与截断以增大(预分配)文件大小

查找与截断以增大(预分配)文件大小

Go
眼眸繁星 2022-08-15 17:36:10
我想为文件预先分配空间。如何增大文件大小?(*os.File).Seek(size,os.SEEK_SET) or (*os.File).Truncate(size)两者之间有什么区别?
查看完整描述

2 回答

?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

Seek 函数可以更改打开文件中的当前位置。在后台,此函数仅调用 lseek 系统调用。这允许将文件偏移量设置到文件末尾之外,而无需更改文件大小。如果尝试设置的偏移量大于文件大小,则将获得稀疏文件 - 在偏移空间上具有孔(值为零的连续字节范围)的文件。稀疏文件通过仅存储孔的元数据而不是使用真正的磁盘块来有效利用存储,因此文件的物理大小不会更改:

//img1.sycdn.imooc.com//62fa13ad0001b35206280659.jpg

截断函数使用截断系统调用更改文件的大小。此函数更改文件的大小,但与 不同,它不会更改 I/O 偏移量。文件的扩展部分读取为空字节 ('\0'),这将更改物理大小。Seek

因此,回答您的问题,您的正确选择将是使用该功能。Truncate


查看完整回答
反对 回复 2022-08-15
?
LEATH

TA贡献1936条经验 获得超6个赞

截断

func Truncate(name string, size int64) error
Truncate 更改了命名文件的大小。如果文件是符号链接,则会更改链接目标的大小。如果存在错误,它将是类型 *PathError

func (*File) 尋找

func (f *File) Seek(offset int64, wherece int) (ret int64, err error)
Seek 设置下一个读取或写入文件的偏移量以进行偏移,并根据以下位置进行解释:0 表示相对于文件的原点,1 表示相对于当前偏移量,2 表示相对于结束。它返回新的偏移量和错误(如果有)。未指定对使用 O_APPEND 打开的文件执行 Seek 的行为。

如果 f 是一个目录,则 Seek 的行为因操作系统而异。您可以在类Unix操作系统上查找目录的开头,但在Windows上则不然。

因此,使用截断,您可以将文件大小更改为设置的大小,使用see,您可以读取文件到一定的偏移量。


查看完整回答
反对 回复 2022-08-15
  • 2 回答
  • 0 关注
  • 90 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信