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

如何在 Golang 中删除大文件的前 N ​​个字节?

如何在 Golang 中删除大文件的前 N ​​个字节?

Go
DIEA 2023-04-24 16:27:41
我有一个大约10G的大文件,我想删除这个文件的前10个字节。如果我使用ioutil.ReadFile(),整个文件将被分配到内存中。这是做不到的!另一个想法是我逐行读取这个文件。删除数据后,我应该逐行写入剩余数据。这样可以节省内存,但有没有更好的办法呢?喜欢split或文件reader?split
查看完整描述

1 回答

?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

在大多数文件系统上,您不能从文件的开头或中间“剪切”出一部分,您只能在末尾截断它。

最简单的实现你想要的是打开源文件,跳过你想要剥离的部分(使用搜索),打开目标文件并简单地从源文件复制到目标文件。

要查找(跳过),请使用File.Seek(). 要在文件之间复制,请使用io.Copy().

这是可以做到的:

fin, err := os.Open("source.txt")

if err != nil {

    panic(err)

}

defer fin.Close()


fout, err := os.Create("dest.txt")

if err != nil {

    panic(err)

}

defer fout.Close()


// Offset is the number of bytes you want to exclude

_, err = fin.Seek(10, io.SeekStart)

if err != nil {

    panic(err)

}


n, err := io.Copy(fout, fin)

fmt.Printf("Copied %d bytes, err: %v", n, err)

请注意,上面的代码将在新文件中获取您想要的结果文件。如果您希望“新”成为旧文件(意味着您不想要不同的文件),则在上述操作之后(如果成功)删除原始文件并将新文件重命名为旧文件。


这就是您执行最后一步的方法:


if err := os.Remove("source.txt"); err != nil {

    panic(err)

}


if err := os.Rename("dest.txt", "source.txt"); err != nil {

    panic(err)

}


查看完整回答
反对 回复 2023-04-24
  • 1 回答
  • 0 关注
  • 164 浏览
慕课专栏
更多

添加回答

举报

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