На самом деле, это уже реализованная функция 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()
вернет ошибку.