我正在尝试对 FileStream 执行分页之类的操作,函数 get FileStream 和 numberOfChunks 和 currentChunk,它将 FileStream 切片为 numberOfChunks 并仅返回 currentChunk 的字节,但仅当 currentChunk 为 0 时才有效
public async Task<byte[]> GetStreamChunkAsync(Stream inputStream, int numberOfChunks, int currentChunk)
{
if (numberOfChunks <= 0 || currentChunk < 0 || currentChunk >= numberOfChunks)
{
throw new ArgumentOutOfRangeException("Invalid numberOfChunks or currentChunk values");
}
int bufferSize = (int)Math.Ceiling((double)inputStream.Length / numberOfChunks);
int startPosition = currentChunk * bufferSize;
int remainingBytes = (int)Math.Min(bufferSize, inputStream.Length - startPosition);
byte[] buffer =new byte[remainingBytes];
int bytesRead = await inputStream.ReadAsync(buffer, startPosition, buffer.Length);
if (bytesRead > 0)
{
return buffer;
}
// Return null if no bytes were read (unexpected end of stream)
return null;
}
您不应该手动设置位置。无论如何,河流都会前进。
您确实有另一个问题:您需要一个读取循环,因为缓冲区可能未完全填满。读取循环看起来像这样
或者你可以使用
ReadAtLeastAsync
话虽如此,我建议您使用新的异步迭代器功能,这意味着您可以
await foreach
对此进行处理。您还可以返回,
Memory<byte>
在返回最后一个部分块的情况下,这会更有效,否则您必须将其复制到新数组。然后像这样使用它