2013-12-11 21 views
1

我有一个大小为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); 
    } 
} 

如何将字节写入文件?

+5

请勿使用'StreamWriter'写*二进制*数据。 –

回答

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()方法之前写入的所有数据都保留在流中。

+0

tks 4你的帮助:) – user3050564