我有一个大小为10124的文件,我添加了一个字节数组,在文件开头有4个长度。 之后文件大小应该变为10128,但是当我将其写入文件时,大小减小到22个字节。我不知道问题出在哪里
public void AppendAllBytes(string path, byte[] bytes)
{
var encryptedFile = new FileStream(path, FileMode.Open, FileAccess.Read);
////argument-checking here.
Stream header = new MemoryStream(bytes);
var result = new MemoryStream();
header.CopyTo(result);
encryptedFile.CopyTo(result);
using (var writer = new StreamWriter(@"C:\\Users\\life.monkey\\Desktop\\B\\New folder (2)\\aaaaaaaaaaaaaaaaaaaaaaaaaaa.docx.aef"))
{
writer.Write(result);
}
}
如何将字节写入文件?
答案 0 :(得分:2)
问题似乎是由以下原因造成的:
使用StreamWriter
编写二进制格式的数据。该名称并未直观地暗示这一点,但StreamWriter
类适用于编写文本数据。
传递整个流而不是实际的二进制数据。要获取存储在MemoryStream
中的字节,请使用方便的ToArray()
方法。
我建议您使用以下代码:
public void AppendAllBytes(string path, byte[] bytes)
{
var fileName = @"C:\\Users\\life.monkey\\Desktop\\B\\New folder (2)\\aaaaaaaaaaaaaaaaaaaaaaaaaaa.docx.aef";
using (var encryptedFile = new FileStream(path, FileMode.Open, FileAccess.Read))
using (var writer = new BinaryWriter(File.Open(fileName, FileMode.Append)))
using (var result = new MemoryStream())
{
encryptedFile.CopyTo(result);
result.Flush(); // ensure header is entirely written.
// write header directly, no need to put it in a memory stream
writer.Write(bytes);
writer.Flush(); // ensure the header is written to the result stream.
writer.Write(result.ToArray());
writer.Flush(); // ensure the encryptdFile is written to the result stream.
}
}
上面的代码使用了BinaryWriter
类,它更适合二进制数据。它有一个Write(byte[] bytes)
方法重载,用于将整个数组写入文件。代码使用对某些人可能认为不需要的Flush()
方法的常规调用,但这些通常保证在调用Flush()
方法之前写入的所有数据都保留在流中。