16

Stream.CopyToを使用して特定のバイト数のみを宛先ストリームにコピーする方法はありますか?最善の回避策は何ですか?

編集:
私の回避策(一部のコードは省略):

internal sealed class Substream : Stream 
    {
        private readonly Stream stream; 
        private readonly long origin;   
        private readonly long length; 
        private long position;        

        public Substream(Stream stream, long length)
        {
            this.stream = stream;
            this.origin = stream.Position;
            this.position = stream.Position;
            this.length = length;            
        }

public override int Read(byte[] buffer, int offset, int count)
        {
            var n = Math.Max(Math.Min(count, origin + length - position), 0);                
            int bytesRead = stream.Read(buffer, offset, (int) n);
            position += bytesRead;
            return bytesRead;            
        }
}

次に、nバイトをコピーします。

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

2 に答える 2

16

ストリームのコピーの実装はそれほど複雑ではありません。特定のバイト数のみをコピーするように調整する場合は、既存のメソッドを微調整するのはそれほど難しくありません。次のようになります。

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

のチェックはbytes > 0おそらく厳密には必要ではありませんが、害を及ぼすことはありません。

于 2012-10-23T00:48:13.357 に答える
6

バッファを使用して必要なバイトをコピーするだけの何が問題になっていますか?

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;
}
于 2012-10-23T00:30:03.027 に答える