如何从文件中删除最后 N 个字节

5 io file go

我想从 Go 中的文件中删除最后 N 个字节,

icz*_*cza 3

其实这个os.Truncate()功能已经实现了。但这个函数采用了新的大小。因此,要使用它,您必须首先获取文件的大小。为此,您可以使用os.Stat().

将其包装成一个函数:

func truncateFile(name string, bytesToRemove int64) error {
    fi, err := os.Stat(name)
    if err != nil {
        return err
    }

    return os.Truncate(name, fi.Size()-bytesToRemove)
}
Run Code Online (Sandbox Code Playgroud)

使用它删除最后 5000 个字节:

if err := truncateFile("C:\\Test.zip", 5000); err != nil {
    fmt.Println("Error:", err)
}
Run Code Online (Sandbox Code Playgroud)

另一种选择是使用File.Truncate()该方法。如果我们有一个os.File,我们也可以用来File.Stat()获取它的大小。

它看起来是这样的:

func truncateFile(name string, bytesToRemove int64) error {
    f, err := os.OpenFile(name, os.O_RDWR, 0644)
    if err != nil {
        return err
    }
    defer f.Close()

    fi, err := f.Stat()
    if err != nil {
        return err
    }

    return f.Truncate(fi.Size() - bytesToRemove)
}
Run Code Online (Sandbox Code Playgroud)

使用它是一样的。如果我们正在处理一个文件(我们已打开它)并且必须截断它,这可能会更好。但在这种情况下,您希望将os.File其名称传递给truncateFile().

注意:如果您尝试删除的字节数多于文件当前的字节数,truncateFile()将返回错误。