猿问

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

我有一个大约10G的大文件,我想删除这个文件的前10个字节。

如果我使用ioutil.ReadFile(),整个文件将被分配到内存中。这是做不到的!

另一个想法是我逐行读取这个文件。删除数据后,我应该逐行写入剩余数据。这样可以节省内存,但有没有更好的办法呢?喜欢split或文件readersplit


DIEA
浏览 165回答 1
1回答

扬帆大鱼

在大多数文件系统上,您不能从文件的开头或中间“剪切”出一部分,您只能在末尾截断它。最简单的实现你想要的是打开源文件,跳过你想要剥离的部分(使用搜索),打开目标文件并简单地从源文件复制到目标文件。要查找(跳过),请使用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)}
随时随地看视频慕课网APP

相关分类

Go
我要回答