.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」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間