[英]Splitting a file into chunks
我正在嘗試將大文件(3gb +)分成100mb的塊,然后通過HTTP發送這些塊。 為了進行測試,我正在處理一個29 mb的文件,大小:30380892,磁盤上的大小:30384128(因此目前沒有使用100mb的限制條件)。
這是我的代碼:
List<byte[]> bufferList = new List<byte[]>();
byte[] buffer = new byte[4096];
FileInfo fileInfo = new FileInfo(file);
long length = fileInfo.Length;
int nameCount = 0;
long sum = 0;
long count = 0;
using (FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read))
{
while (count < length)
{
sum = fs.Read(buffer, 0, buffer.Length);
count += sum;
bufferList.Add(buffer);
}
var output2 = new byte[bufferList.Sum(arr => arr.Length)];
int writeIdx2 = 0;
foreach (var byteArr in bufferList)
{
byteArr.CopyTo(output2, writeIdx2);
writeIdx2 += byteArr.Length;
}
HttpUploadBytes(url, output2, ++nameCount + fileName, contentType, path);
}
在此測試代碼中,我將讀取的每個緩沖區添加到列表中,讀完后將緩沖區數組組合為一個完整的數組。 問題是,我得到的結果(output2大小)是30384128(作為磁盤上的大小),因此在服務器中收到的文件已損壞。
我究竟做錯了什么?
問題是您一直將相同大小為4KB的buffer
添加到bufferList
。 這就是為什么您收到的文件大小與磁盤上的大小匹配的原因(在您的情況下,它恰好四舍五入到最接近的4KB)。
代碼的一個更大的問題是,您發送的數據是錯誤的,因為您一直在覆蓋buffer
的數據。 例如,如果您發送200個塊,則意味着您發送了200個buffer
的最后內容的副本。
修復相對簡單-在添加到bufferList
之前先制作緩沖區的副本:
bufferList.Add(buffer.Take(sum).ToArray());
這也將解決大小問題,因為最后一個塊的大小較小,如上次調用的sum
所表示。 不過,最重要的是, bufferList
將包含緩沖區的副本,而不是對緩沖區本身的引用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.