簡體   English   中英

C#將文件拆分為兩個字節數組

[英]C# Split a file into two byte arrays

因為字節數組的最大值為2GB,所以可以說我有一個更大的文件,我需要將其轉換為字節數組。 由於我無法保存整個文件,應如何將其轉換為兩個?

我試過了:

long length = new System.IO.FileInfo(@"c:\a.mp4").Length;
int chunkSize = Convert.ToInt32(length / 2); 


byte[] part2;
FileStream fileStream = new FileStream(filepath, FileMode.Open, FileAccess.Read);
try
{
    part2 = new byte[chunkSize];            // create buffer
    fileStream.Read(part2, 0, chunkSize);
}
finally
{
    fileStream.Close();
}

byte[] part3;
fileStream = new FileStream(filepath, FileMode.Open, FileAccess.Read);
try
{
    part3 = new byte[chunkSize];            // create buffer
    fileStream.Read(part3, 5, (int)(length - (long)chunkSize));
}
finally
{
    fileStream.Close();
}

但它不起作用。

有任何想法嗎?

您可以使用StreamReader 讀入太大而無法讀入字節數組的文件

const int max = 1024*1024;

public void ReadALargeFile(string file, int start = 0)
{
    FileStream fileStream = new FileStream(file, FileMode.Open,FileAccess.Read);
    using (fileStream)
    {
        byte[] buffer = new byte[max];
        fileStream.Seek(start, SeekOrigin.Begin);
        int bytesRead = fileStream.Read(buffer, start, max);
        while(bytesRead > 0)
        {
            DoSomething(buffer, bytesRead);
            bytesRead = fileStream.Read(buffer, start, max);
        }
    }
}

如果要處理非常大的文件,則應使用MemoryMappedFile ,它將物理文件映射到內存空間:

using (var mmf = MemoryMappedFile.CreateFromFile(@"c:\path\to\big.file"))
{
    using (var accessor = mmf.CreateViewAccessor())
    {
        byte myValue = accessor.ReadByte(someOffset);
        accessor.Write((byte)someValue);
    }
}

另請參閱: MemoryMappedViewAccessor

您還可以使用MemoryMappedViewAccessor的不同方法讀取/寫入文件塊。

這是我的解決方案:

byte[] part1;
byte[] part2;
bool odd = false;
int chunkSize = Convert.ToInt32(length/2);


if (length % 2 == 0)
{
    part1 = new byte[chunkSize];
    part2 = new byte[chunkSize];
}
else
{
    part1 = new byte[chunkSize];
    part2 = new byte[chunkSize + 1];
    odd = true;
}

FileStream fileStream = new FileStream(filepath, FileMode.Open, FileAccess.Read);
using (fileStream)
{
    fileStream.Seek(0, SeekOrigin.Begin);
    int bytesRead = fileStream.Read(part1, 0, chunkSize);
    if (odd)
    {
        bytesRead = fileStream.Read(part2, 0, chunkSize + 1);
    }
    else
    {
        bytesRead = fileStream.Read(part2, 0, chunkSize);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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