其实这个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()将返回错误。