2010-12-12 5 views
1

C#을 사용하여 스트림에서 이진 정보를 보존하는 것이 얼마나 복잡한 지 알게되었습니다. WebRequest 클래스를 사용하여 PNG 데이터 파일을 다운로드하려고하지만 파일을 손상시키지 않고 결과 스트림을 파일로 전송하는 것은 생각보다 자세한 내용입니다. 첫째로, StreamToer 및 StreamWriter를 사용하는 것은 좋지 않습니다. ReadToEnd() 함수는 문자열을 반환합니다. 이는 실제로 UTF 변환으로 인해 PNG 파일의 크기를 두 배로 만듭니다. (아마도 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을 사용하는 것은 확실히 실수입니다. 그렇습니다. 파일을 텍스트로로드하려고 시도하고 있습니다.

옵션 :

  • SLaks는 .NET 4에서
  • 을 제안 사용 WebClient.DownloadFile, 당신이 그렇지 않으면 여기
  • 있어와 같은 방식으로 데이터를 복사 할 Stream.CopyTo(Stream)를 사용하여 작성하여 복사를 할 수있는 자신의 유틸리티 메소드를 사용하면 한 번만 수행하면됩니다. 당신은 당신이 .NET 4로 업그레이드 방금 유틸리티 메소드 제거 할 수 및 사용할 때 의미 확장 방법으로이 쓸 수있는 내장 한 호출 코드 변경없이 :

    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 :) 감사합니다. –