簡體   English   中英

將文件分成大塊

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM