Как удалить последние N байтов из файла - PullRequest
0 голосов
/ 01 февраля 2019

Я хочу удалить последние N байтов из файла в Go, я имею в виду изменение размера файла без создания нового временного файла и после переименования временного файла с копией блока.

Я хочу сделать это в режиме чтения-записи.:

    // 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();

1 Ответ

0 голосов
/ 01 февраля 2019

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

...