gpt4 book ai didi

c# - 如何按 block 读取文件

转载 作者:行者123 更新时间:2023-12-05 09:21:01 25 4
gpt4 key购买 nike

我对如何按 block 读取大文件(> 8GB)感到有点困惑,以防每个 block 都有自己的大小。

如果我知道 block 大小,它看起来像下面的代码:

using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, ProgramOptions.BufferSizeForChunkProcessing))
{
using (BufferedStream bs = new BufferedStream(fs, ProgramOptions.BufferSizeForChunkProcessing))
{
byte[] buffer = new byte[ProgramOptions.BufferSizeForChunkProcessing];
int byteRead;
while ((byteRead = bs.Read(buffer, 0, ProgramOptions.BufferSizeForChunkProcessing)) > 0)
{
byte[] originalBytes;
using (MemoryStream mStream = new MemoryStream())
{
mStream.Write(buffer, 0, byteRead);
originalBytes = mStream.ToArray();
}
}
}
}

但是想象一下,我已经按 block 读取大文件,对每个 block 进行一些编码(更改该操作后 block 的大小)并将所有处理过的 block 写入另一个新文件。现在我需要做相反的操作。但我不知道确切的 block 大小。我有个主意。在处理完每个 block 之后,我必须在 block 字节之前写入新的 block 大小。像这样:

Number of block bytes
Block bytes
Number of block bytes
Block bytes

所以在那种情况下,首先我需要做的是读取 block 的 header 并准确了解 block 大小。我只读取和写入文件字节数组。但我有一个问题 - 应该如何查看 block 的 header ?标题可能必须包含一些边界?

最佳答案

如果文件结构严格,每个数据 block 前面都有一个 32 位长度的值,那么它很容易阅读。每个 block 的“ header ”只是 32 位长度值。

如果你想读取这样的文件,最简单的方法可能是将读取封装到一个返回IEnumerable<byte[]>的方法中。像这样:

public static IEnumerable<byte[]> ReadChunks(string path)
{
var lengthBytes = new byte[sizeof(int)];

using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read))
{
int n = fs.Read(lengthBytes, 0, sizeof (int)); // Read block size.

if (n == 0) // End of file.
yield break;

if (n != sizeof(int))
throw new InvalidOperationException("Invalid header");

int blockLength = BitConverter.ToInt32(lengthBytes, 0);
var buffer = new byte[blockLength];
n = fs.Read(buffer, 0, blockLength);

if (n != blockLength)
throw new InvalidOperationException("Missing data");

yield return buffer;
}
}

然后就可以简单的使用了:

foreach (var block in ReadChunks("MyFileName"))
{
// Process block.
}

请注意,您不需要提供自己的缓冲。

关于c# - 如何按 block 读取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35407824/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com