C#将文件拆分为两个字节数组

时间:2018-03-29 15:21:37

标签: c# arrays file byte

因为字节数组的最大值是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();
}

但它不起作用。

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

您可以使用StreamReader阅读file too large to read into a byte array

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);
        }
    }
}

答案 1 :(得分:2)

如果您使用的是非常大的文件,则应使用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中的不同方法读取/写入文件块。

答案 2 :(得分:0)

这是我的解决方案:

if (myTreeView.SelectedItem is TreeSponsor)
        {
            TreeSponsor ts = (TreeSponsor)myTreeView.SelectedItem;

            ts.Studies[0].Documents[0].IsSelected = true;
        }