.NET TIPS

ストリームを簡単にコピーするには?[4以降、C#、VB]

デジタルアドバンテージ 一色 政彦
2010/08/12

 ストリームを処理するとき、そのストリームをいったん別のストリームにコピーして処理することがある。その場合、.NET Framework 3.5以前では下記のコードのように、一方のストリームから(バイト・データを)読み込み、もう一方のストリームに書き込むという処理が必要であった。

using System;
using System.IO;

class Program
{
  static void Main()
  {
    using (FileStream source = new FileStream(
      "picture.jpg", FileMode.Open, FileAccess.Read))
    using (MemoryStream destination = new MemoryStream())
    {
      Console.WriteLine(
        "コピー元の長さ:{0:d}", source.Length);

      // ストリームのコピー
      int size = 4096;
      byte[] buffer = new byte[size];
      int numBytes;
      while ((numBytes = source.Read(buffer, 0, size)) > 0)
      {
        destination.Write(buffer, 0, numBytes);
      }

      // 何らかの処理(ここでは省略)
      Console.WriteLine(
        "コピー先の長さ:{0:d}", destination.Length);

      Console.ReadKey();  // 実行を停止

      // 出力例:
      // コピー元の長さ:29489
      // コピー先の長さ:29489
    }
  }
}
Imports System.IO

Module Module1

  Sub Main()

    Using source As New FileStream( _
      "picture.jpg", FileMode.Open, FileAccess.Read), _
      destination As New MemoryStream
      Console.WriteLine( _
          "コピー元の長さ:{0:d}", source.Length)

      ' ストリームのコピー
      Dim size As Integer = 4096
      Dim buffer(size) As Byte
      Dim numBytes As Integer
      While True
        numBytes = source.Read(buffer, 0, size)
        If numBytes <= 0 Then
          Exit While
        End If
        destination.Write(buffer, 0, numBytes)
      End While

      ' 何らかの処理(ここでは省略)
      Console.WriteLine( _
        "コピー先の長さ:{0:d}", destination.Length)

      Console.ReadKey()  ' 実行を停止

      ' 出力例:
      ' コピー元の長さ:29489
      ' コピー先の長さ:29489
    End Using

  End Sub

End Module
.NET Framework 3.5以前におけるストリームのコピー(上:C#、下:VB)

 なお、上記コードで用いているFileStreamクラスやMemoryStreamクラスは、Streamクラスの派生クラスである(いずれもSystem.IO名前空間のクラス)。

 .NET Framework 4では、StreamクラスにCopyToメソッドが追加され、下記のコード例のようにシンプルにストリームのコピーを実装できるようになった。

using System;
using System.IO;

class Program
{
  static void Main()
  {
    using (FileStream source = new FileStream(
      @"picture.jpg", FileMode.Open, FileAccess.Read))
    using (MemoryStream destination = new MemoryStream())
    {
      Console.WriteLine(
        "コピー元の長さ:{0:d}", source.Length);

      // ストリームのコピー
      source.CopyTo(destination);

      // 何らかの処理(ここでは省略)
      Console.WriteLine(
        "コピー先の長さ:{0:d}", destination.Length);

      Console.ReadKey();  // 実行を停止

      // 出力例:
      // コピー元の長さ:29489
      // コピー先の長さ:29489
    }
  }
}
Imports System.IO

Module Module1

  Sub Main()

    Using source As New FileStream( _
      "picture.jpg", FileMode.Open, FileAccess.Read), _
      destination As New MemoryStream
      Console.WriteLine( _
          "コピー元の長さ:{0:d}", source.Length)

      ' ストリームのコピー
      source.CopyTo(destination)

      ' 何らかの処理(ここでは省略)
      Console.WriteLine( _
        "コピー先の長さ:{0:d}", destination.Length)

      Console.ReadKey()  ' 実行を停止

      ' 出力例:
      ' コピー元の長さ:29489
      ' コピー先の長さ:29489
    End Using

  End Sub

End Module
.NET Framework 4におけるストリームのコピー(上:C#、下:VB)

 上記コードのように、コピー元のストリームが持つCopyToメソッドを呼び出し、そのメソッドのパラメータにコピー先のストリームを指定すればよい。End of Article

利用可能バージョン:.NET Framework 4以降
カテゴリ:クラス・ライブラリ 処理対象:バイナリ・ファイル
使用ライブラリ:Streamクラス(System.IO名前空間)
使用ライブラリ:FileStreamクラス(System.IO名前空間)
使用ライブラリ:MemoryStreamクラス(System.IO名前空間)

この記事と関連性の高い別の.NET TIPS
ストリームからバイナリ・データを読み込み配列に格納するには?
バイナリ・ファイルを読み書きするには?
WebRequest/WebResponseクラスでWebページを取得するには?
Visual Studioのコード・エディタでボックス選択をするには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」

@IT Special

- PR -

TechTargetジャパン

Insider.NET フォーラム 新着記事
  • 配列のコピーを1行でするには? (2017/4/26)
     配列をコピーするには、for/foreachループを使う方法もあるが、ArrayクラスのCopyメソッドを使うのが一番簡単で速度の面でも有利である
  • Microsoft Small Basic (2017/4/25)
     Microsoft Small Basicは学習を目的としてマイクロソフトが提供しているBASICの処理系。シンプルな言語仕様、習得が容易、簡潔な記述がその特徴
  • 第2回 Visual Studio 2017の基礎を知る (2017/4/21)
     開発環境Visual Studio 2017を使ったプログラミングに不可欠な知識とは? ソリューションの概念から画面構成まで基礎を説明
  • XmlSerializerでシリアライズ/デシリアライズする (2017/4/19)
     XmlSerializerクラスでシリアライズ/デシリアライズを行うと、デシリアライズに失敗することがある。その回避策を含め、XmlSerializerクラスの使い方を説明する
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

イベントカレンダー

PickUpイベント

- PR -

アクセスランキング

もっと見る

ホワイトペーパーTechTargetジャパン

注目のテーマ

Insider.NET 記事ランキング

本日 月間
ソリューションFLASH