为什么二进制文件的大小在使用时不会减少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();
}
Run Code Online (Sandbox Code Playgroud)
使用上述方法时,大小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();
}
Run Code Online (Sandbox Code Playgroud)
通过添加双重类型运行下面的函数比文件的大小增加从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();
}
Run Code Online (Sandbox Code Playgroud)
这与此无关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()
}
Run Code Online (Sandbox Code Playgroud)