我想从Go中的文件中删除最后N个字节, 我的平均大小是在不创建新临时文件的情况下调整文件大小,而在块复制后重命名临时文件。
我想做到的是读写模式,就像这样:
// Read Write Mode
file, err := os.OpenFile("C:\\Test.zip", os.O_RDWR, 0644)
if err != nil {
return err
}
例如.NET中的示例如下:
FileInfo fi = new FileInfo("filename");
FileStream fs = fi.Open(FileMode.Open);
long bytesToDelete = 5000;
fs.SetLength (Math.Max(0, fi.Length - bytesToDelete));
fs.Close();
答案 0 :(得分:2)
实际上,已经实现了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)
}
使用它删除最后的5000个字节:
if err := truncateFile("C:\\Test.zip", 5000); err != nil {
fmt.Println("Error:", err)
}
另一种替代方法是使用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)
}
使用相同。如果我们正在处理文件(已打开文件)并且必须截断它,则这可能是更可取的。但是在这种情况下,您希望将os.File
而不是其名称传递给truncateFile()
。
注意:如果您尝试删除的字节数超出了文件的当前字节数,truncateFile()
将返回错误。