2013-12-11 20 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