C# 是否可以使用Stream.CopyTo仅复制特定数量的字节?

C# 是否可以使用Stream.CopyTo仅复制特定数量的字节?,c#,C#,是否有任何方法可用于仅将特定数量的字节复制到目标流?最好的解决办法是什么 编辑: 我的解决方法(省略了一些代码): 然后要复制n个字节: var substream = new Substream(stream, n); substream.CopyTo(stm); 使用缓冲区复制所需的字节有什么不对 long CopyBytes(long bytesRequired, Stream inStream, Stream outStream) { long

是否有任何方法可用于仅将特定数量的字节复制到目标流?最好的解决办法是什么

编辑:
我的解决方法(省略了一些代码):

然后要复制n个字节:

var substream = new Substream(stream, n);
                substream.CopyTo(stm);

使用缓冲区复制所需的字节有什么不对

long CopyBytes(long bytesRequired, Stream inStream, Stream outStream)
{
    long readSoFar = 0L;
    var buffer = new byte[64*1024];
    do
    {
        var toRead = Math.Min(bytesRequired - readSoFar, buffer.Length);
        var readNow = inStream.Read(buffer, 0, (int)toRead);
        if (readNow == 0)
            break; // End of stream
        outStream.Write(buffer, 0, readNow);
        readSoFar += readNow;
    } while (readSoFar < bytesRequired);
    return readSoFar;
}
long CopyBytes(需要长字节、流内流、流外流)
{
长读数至=0升;
var buffer=新字节[64*1024];
做
{
var toRead=Math.Min(bytesRequired-readSoFar,buffer.Length);
var readNow=inStream.Read(缓冲区,0,(int)toRead);
如果(readNow==0)
break;//流结束
outStream.Write(缓冲区,0,readNow);
readSoFar+=readNow;
}while(readSoFar
的实现并不过于复杂。如果您想调整它以仅复制一定数量的字节,那么调整现有方法应该不会太困难,比如

public static void CopyStream(Stream input, Stream output, int bytes)
{
    byte[] buffer = new byte[32768];
    int read;
    while (bytes > 0 && 
           (read = input.Read(buffer, 0, Math.Min(buffer.Length, bytes))) > 0)
    {
        output.Write(buffer, 0, read);
        bytes -= read;
    }
}

检查
字节数>0
可能不是绝对必要的,但不会造成任何伤害。

读取该字节数并将其写入目标流?我将代码包装在一个函数中,以使其更清晰,如果你不想要的话,你可以把它回滚。我想我更喜欢我的实现,但我还是对这一个投了更高的票,因为它基本上做了相同的事情:)贾斯汀-你的实现很好,我喜欢while,它消除了中断,即使它确实在开始时添加了一个额外的比较(我知道,学究)。我喜欢我的,因为它跟踪复制的字节总数,如果它们与所需字节数不同,这可能很重要。只需将函数中的“bytes”类型更改为“long”即可完成。投票结果:)谢谢@henon。有一个丢失的“;”我丢失了对int的转换。现在已修复。要支持4GB以上的流,只需将int参数更改为long参数,然后在Math.Min函数中将其转换为int。
public static void CopyStream(Stream input, Stream output, int bytes)
{
    byte[] buffer = new byte[32768];
    int read;
    while (bytes > 0 && 
           (read = input.Read(buffer, 0, Math.Min(buffer.Length, bytes))) > 0)
    {
        output.Write(buffer, 0, read);
        bytes -= read;
    }
}