2016-01-19 45 views
-2

我有我自己創建的zip程序,farArray和字節的兩個數組。它們都是字節數組。如何在C#中將2個字節數組寫入文件?

現在我想將它保存在一個文件中(例如:「file.zip」)。我知道我可以寫這個代碼的字節:

File.WriteAllBytes(savefile.FileName, bytes); 

但我現在只保存一個字節數組。我如何保存其中兩個?

我可以找回兩個數組,如果我打開我的腳本中的文件?

+0

我忘了添加這個,我不想使用方法。只是代碼。 –

+0

將它們連接在一起。當然,現在,除非你的數組是已知的,固定的長度,你需要在開始時包含某種標題,告訴你一個數組在哪裏開始,另一個結束。或者您需要某種分隔符字節/字節序列來顯示第一個結尾的位置。 –

+1

*我不想使用方法。只是代碼*,那應該是什麼意思? –

回答

1

如果我理解你的權利:

using (var stream = new FileStream(savefile.FileName, FileMode.Append)) 
{ 
    stream.Write(bytes, 0, bytes.Length); 
    stream.Write(farArray, 0, farArray.Length); 
} 

如果你想拿回你的陣列,可以使用structered文件格式。例如JSON。或者在數組之間設置一些標籤。或者在文件的頭部寫入數組的大小,然後使用這些數據來獲取數組。

+0

有人可以解釋下:如果我使用這個功能?如果我再次打開,我怎麼能找回兩個數組? –

+0

只需再次使用你的數組。它沒有被清除。 – fryday

+0

因此,讓我們打開這個文件@fryday。第一個字節數組停止並且第二個字節數組從哪裏開始?你沒有將它編碼到文件中。 – spender

2

合併兩個數組,然後執行寫操作:

byte[] array1; // This will be the array1 
byte[] array2; // This will be the array1 
byte[] combinedArray = new byte[array1.Length + array2.Length ]; 
Array.Copy(array1, 0, combinedArray, 0, array1.Length); 
Array.Copy(array2, 0, combinedArray, array1.Length, array2.Length); 

現在combinedArray是一個字節數組,它包含來自ARRAY1和數組2所有的字節。所以寫這個數組會給你結果:

File.WriteAllBytes(savefile.FileName, combinedArray); 
+1

如果我們只需要編寫它們,什麼用於組合數組? – fryday

1

所以你想寫兩個數組到一個文件。你可以將你的兩個數組連接成一個數組並寫入(類似於非幸運的答案),或者你可以用兩個單獨的操作(比如fryday的答案)來編寫數組。這兩種方法都是完全有效的方法。雖然將數組僅僅用於寫入文件的目的顯然不是那麼高效。

你更大的問題是當你想讀回數據時你要做什麼。當你去閱讀它時,它看起來就像一個大陣列。你怎麼知道一個陣列結束,另一個開始?

有幾種方法可以考慮處理該問題。如果數組有一個知道的,固定的大小,那麼這不是什麼大不了的。例如,如果你知道bytes始終是100個字節長,farArray始終是200個字節長(例如),那麼你可以這樣閱讀:

var bytes = new byte[100]; 
var farArray = new byte[200]; 
stream.Read(bytes, 0, 100); 
stream.Read(farArray, 0, 200); 

容易。現在,如果你的數組不是固定的長度。那麼最簡單的解決方案可能是在文件的開頭添加一個包含兩個數組長度的頭文件。所以,當你寫,你會做這樣的事情:你的文件的

stream.Write(BitConverter.GetBytes(bytes.Length), 0, 4); 
stream.Write(BitConverter.GetBytes(farArray.Length), 0, 4); 
stream.Write(bytes, 0, bytes.Length); 
stream.Write(farArray, 0, farArray.Length); 

現在前8個字節(二的Int32的)將包含下面的兩個數組的長度。所以,閱讀你會做這樣的事情:

var byteLengthArray = new byte[4]; 
var farLengthArray = new byte[4]; 
stream.Read(byteLengthArray, 0, 4); 
stream.Read(farLengthArray, 0, 4); 
// Note: you may have to worry about endianness if a file is written 
// with one architecture and read with another. 
var byteLength = BitConverter.ToInt32(byteLengthArray, 0); 
var farLength = BitConverter.ToInt32(farLengthArray, 0); 
// now we know how big the two arrays are! 
var bytes = new byte[byteLength]; 
var farArray = new byte[farLength]; 
stream.Read(bytes, 0, byteLength); 
stream.Read(farArray, 0, farLength); 

另一種方式,你能做到這一點,儘管這使閱讀更加繁瑣,是包括的一些字節一個字節或一組在兩個陣列之間的分隔符。要做到這一點,你必須確保分隔符不能出現在任何一個數組中的任何地方。所以你會寫這樣的東西:

stream.Write(bytes, 0, bytes.Length); 
stream.Write(delimiter, 0, delimiter.Length); 
stream.Write(farArray, 0, farArray.Length); 

現在讀這是有點棘手。可能最簡單的方法是讀取全部的字節,然後搜索分隔符字符串。一旦找到分隔符開始的位置(索引),就可以將它之前的所有字節複製到bytes,並將所有字節(考慮到分隔符數組的長度)複製到farArray

當然,避免所有這些棘手和容易出錯的字節複製的更簡單的方法就是使用框架提供的序列化和反序列化工具。除非你有一個很好的理由(比如你需要你的文件超小型),否則你可能不應該發明自己的文件格式。

+0

它在此行崩潰:stream.Read(byteLengthArray,0,4); –

+1

@PieterBerkel:「崩潰」不是問題描述。它給你什麼錯誤?你的代碼是什麼樣的? –

+0

我用第二張保存代碼保存文件。然後我打開它:使用(var stream = new FileStream(file_path,FileMode.Append)){在這裏我處理您的代碼},並且我得到一個未知的錯誤。 –

相關問題