2010-12-12 13 views
1

C#を使用して、ストリームからバイナリ情報を保持するのがどれほど複雑であるかは驚きました。 WebRequestクラスを使用してPNGデータファイルをダウンロードしようとしていますが、結果のストリームをファイルに転送するだけで、破損することなく、私は思ったよりも冗長です。まず、StreamToerとStreamWriterを使用するだけでは、ReadToEnd()関数がPNGファイルのサイズを実質的に2倍にする文字列を返すため、うまくいきませんでした(おそらくUTF変換によるものです)バイナリデータをストリームに保存する

私の質問は、このコードをすべて記述するか、よりクリーンな方法がありますか?

  Stream srBytes = webResponse.GetResponseStream(); 
      // Write to file 
      Stream swBytes = new FileStream("map(" + i.ToString() + ").png",FileMode.Create,FileAccess.Write); 
      int count = 0; 
      byte[] buffer = new byte[4096]; 
      do 
      { 
       count = srBytes.Read(buffer, 0, buffer.Length); 
       swBytes.Write(buffer, 0, count); 
      } 
      while (count != 0); 
      swBytes.Close(); 
+2

あなたはなどの任意のバイトストリームを扱うことはありませんしかし、文字列。彼らはそうではないので。 – Joey

答えて

4

StreamReader/StreamWriterを使用している間違いは間違いですが、それはファイルをテキストとして読み込もうとしているからです。

オプション:

  • 使用WebClient.DownloadFile SLaksはあなたを書き、あなたがそうでなければ、ここで
  • を持っているとほとんど同じ方法でデータをコピーするStream.CopyTo(Stream)を使用し、.NET 4で

  • を示唆してコピーを行う独自のユーティリティメソッドを使用すると、一度だけ実行する必要があります。あなたも、あなたは.NET 4にアップグレードしたばかりのユーティリティメソッドを取り除くことができ、使用する場合を意味し、拡張メソッドとしてこれを書くことができます内蔵の1呼び出し元のコードを変更せずに:

    public static class StreamExtensions 
    { 
        public static void CopyTo(this Stream source, Stream destination) 
        { 
         if (source == null) 
         { 
          throw new ArgumentNullException("source"); 
         } 
         if (destination == null) 
         { 
          throw new ArgumentNullException("destination"); 
         } 
         byte[] buffer = new byte[8192]; 
         int bytesRead; 
         while ((bytesRead = source.Read(buffer, 0, buffer.Length)) > 0) 
         { 
          destination.Write(buffer, 0, bytesRead); 
         } 
        } 
    } 
    
あなたは、彼らは常にこのよう、適切に閉じられていることを確認するために、ウェブ応答、応答ストリームと出力ストリームの using文を使用する必要があります

注:

using (WebResponse response = request.GetResponse()) 
using (Stream responseStream = response.GetResponseStream()) 
using (Stream outputStream = File.OpenWrite("map(" + i + ").png")) 
{ 
    responseStream.CopyTo(outputStream); 
} 
+1

Skiiilz :)ありがとう –

関連する問題