2012-01-30 2 views
0

FTPWebRequest를 사용하여 FTP에서 파일을 복사하려고했는데 여기에 wcf 블록이 있습니다. 은 "사용"블록 System.array에 ToArray에 대한 정의가없고 확장 메서드가 없습니다.

long cl = response.ContentLength; 
       int bufferSize = 4155; 
       int readCount=0; 
       int i = 0; 
       byte[] newbuffer; 
       byte[] buffer = new byte[bufferSize]; 

       //Follow the Using here 
       using (Stream input = response.GetResponseStream()) 
       { 
        readCount = input.Read(buffer, 0, buffer.Length); 
        if (readCount > 0) 
        { 
         newbuffer = new byte[readCount]; 
         Array.Copy(buffer, newbuffer, readCount); 
         outputStream.Write(newbuffer.ToArray(), 0, readCount); 


        } 
        outputStream.Close(); 
       } 

       ftpStream.Close(); 

       response.Close(); 

      } 

는 "DotNetUser"부재에 의해 제안 된, 나 코드 outputStream.Write (newbuffer.ToArray(), 0, readCount) 중 한 가지를 발견; "ToArray"에서 예외가 발생하면 outputStream.Write (newbuffer, 0, readCount)와 같아 보입니다. 제발 제안 해주세요.

+0

' Array'는'ToArray' 메쏘드가 확장되는 타입 인 IEnumerable 을 구현하지 않습니다. 'newbuffer'는 이미'Array' 타입입니다. 왜 변환해야합니까? –

+1

질문 끝에 자신의 답을 썼습니다. 이것을 시도하고 그것은 당신을 위해 작동 했습니까? 그렇지 않다면 어떤 오류가 있습니까? –

+0

@ M.Babcock : 배열에서 IEnumerable 을 구현하지 않는다는 잘못된 생각은 어디에서 나왔나요? ".NET Framework 버전 2.0에서 Array 클래스는 System.Collections.Generic.IList , System.Collections.Generic.ICollection 및 System.Collections.Generic을 구현합니다. IEnumerable '일반 인터페이스. " 물론 두 번째 요점은 정확합니다. – jason

답변

1

변수는 이미 배열이므로 변수를 배열로 변환 할 필요가 없습니다. 당신은 사용할 수 있습니다

outputStream.Write(newbuffer, 0, readCount); 

그러나, 전혀 newbuffer 배열을 만들 이유가 없습니다. 다만 buffer 어레이로부터 데이터 쓰기

readCount = input.Read(buffer, 0, buffer.Length); 
if (readCount > 0) { 
    outputStream.Write(buffer, 0, readCount); 
} 

그러나, 이것은 단지 스트림 데이터의 첫 번째 블록을 판독한다. 더 이상 데이터가 없을 때까지 당신은 읽을 루프 필요

do { 
    readCount = input.Read(buffer, 0, buffer.Length); 
    if (readCount > 0) { 
    outputStream.Write(buffer, 0, readCount); 
    } 
} until (readCount == 0); 
+1

.NET 4를 사용하는 경우 새로운 'CopyTo'스트림 확장을 사용할 수 있습니다. –

+0

큰 도움을 주신 M.Babcock, Moozhe, Jason, LukeH, Guffa, BrokenGlass 감사합니다. – Usher

+0

왜이 질문에 대해 Minus 평판을 얻었습니까? – Usher

3

ToArray()? newbuffer 바이트의 배열입니다 당신은 그것을 좋아 쓸 수 있습니다 :

outputStream.Write(newbuffer, 0, readCount); 

그러나 당신은 System.Linq 네임 스페이스를 가져올 수 있습니다.

+0

도움을 주셔서 감사합니다. 이미 내 코드를 outputStream.Write (newbuffer, 0, readCount)로 변경했습니다. 그것도 System.Linq 네임 스페이스를 가져 와서 작동합니다. – Usher

+0

@ 사용자 - 오타. 확장 메서드를 사용하지 않으려면 System.Linq를 가져올 필요가 없습니다. – adatapost

+0

다시 한 번 고맙습니다. – Usher

0

당신은 임시 버퍼가 필요하지 않습니다 - 단지 바로 CopyTo()를 사용하여 스트림을 복사 (.NET 4 필수) :

using (Stream input = response.GetResponseStream()) 
{ 
    input.CopyTo(outputStream); 
} 
+0

감사합니다 무리들, outputStream.Write (newbuffer, 0, readCount)를 사용하고 있습니다; 그것은 잘 작동하지만 코드는 stackoverflow에 의해 다른 전문가 (DotNetuser)에 의해 제안 된 그래서 그의 코드를 실행하려고 및 ToArray 예외를 throw 시작, 그때 내가 뭔가를 놓친 오전 생각했다. 그 이유는 내가 여기 물었다. 저에게 준 사람 "마이너스"라는 명성을 가져다 주시겠습니까? – Usher

관련 문제