|
.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メソッドを呼び出し、そのメソッドのパラメータにコピー先のストリームを指定すればよい。
利用可能バージョン:.NET Framework 4以降
カテゴリ:クラス・ライブラリ 処理対象:バイナリ・ファイル
使用ライブラリ:Streamクラス(System.IO名前空間)
使用ライブラリ:FileStreamクラス(System.IO名前空間)
使用ライブラリ:MemoryStreamクラス(System.IO名前空間) |
|
generated by
|
|
Insider.NET 記事ランキング
本日
月間