使用BinaryWriter时,为什么二进制文件的大小不会减少

时间:2015-12-18 12:01:02

标签: c# .net

为什么使用BinaryWriter时二进制文件的大小不会减少? 考虑第一段代码:

static void write()
{
    BinaryWriter sr = new BinaryWriter(File.OpenWrite("bin.txt"));
    int m;
    m = 123456;
    sr.Write(m);
    m = 122;
    sr.Write(m);
    sr.Close();
}

使用上述方法时,bin.txt的大小为8个字节。

但是当我从函数中删除m = 122和第二个Write调用并再次运行程序时,我希望将文件大小更改为4个字节,但它仍然是8个字节字节。

static void write()
{
    BinaryWriter sr = new BinaryWriter(File.OpenWrite("bin.txt"));
    int m;
    m = 123456;
    sr.Write(m);
    sr.Close();
}

通过添加双重类型运行下面的函数而不是文件大小从8增加到12。

static void write()
{
    BinaryWriter sr = new BinaryWriter(File.OpenWrite("bin.txt"));
    int m;
    m = 123456;
    sr.Write(m);
    double pp = 1233.00;
    sr.Write(pp);
    sr.Close();
}

1 个答案:

答案 0 :(得分:6)

这与BinaryWriter无关,实际上是File.OpenWrite调用,其文档包括:

  

OpenWrite方法打开文件(如果文件路径已存在),或者创建新文件(如果不存在)。对于现有文件,它不会将新文本附加到现有文本。相反,它会用新字符覆盖现有字符。如果用较短的字符串(例如“Second run”)覆盖较长的字符串(例如“这是对OpenWrite方法的测试”),该文件将包含混合字符串(“OpenWrite方法的第二次运行测试” “)。

所以你的第二个方法只写了四个字节 - 但是它会覆盖文件的前四个字节,而不会截断文件本身。

使用File.Create代替,任何现有文件都将被截断。

我还建议您使用using语句,而不是手动关闭资源:

using (var writer = new BinaryWriter(File.Create("foo"))
{
    // Code here, no need to call writer.Close()
}