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

时间:2019-02-01 12:44:35

标签: file go io

我想从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();

1 个答案:

答案 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()将返回错误。