system.array不包含ToArray的定义,也没有扩展方法

system.array不包含ToArray的定义,也没有扩展方法

问题描述:

我试图使用FTPWebRequest在我的wcf块中从FTP复制文件,下面是代码。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

'数组''不执行'IEnumerable '这是'ToArray'方法扩展的类型。 'newbuffer'已经是'Array'类型了,你为什么需要转换它? – 2012-01-30 01:53:05

+1

你在问题结尾写了你自己的答案。你是否尝试过这种方法,并为它工作?如果没有,你给了什么错误? – 2012-01-30 01:53:29

+0

@ M.Babcock:你从哪里得到错误的想法,即数组没有实现'IEnumerable '?从规范:“在.NET Framework 2.0版中,Array类实现了System.Collections.Generic.IList ,System.Collections.Generic.ICollection 和System.Collections.Generic。 IEnumerable '通用接口。“当然,你的第二点是正确的。 – jason 2012-01-30 01:56:40

newbuffer变量已经是一个数组,因此您不需要将其转换为数组。你可以使用:

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流扩展。 – 2012-01-30 02:05:53

+0

非常感谢M.Babcock,Moozhe,Jason,LukeH,Guffa,BrokenGlass为您提供的巨大帮助 – Usher 2012-01-30 03:08:09

+0

为什么我得到了Minus这个问题的声誉? – Usher 2012-01-30 03:14:42

为什么ToArray()newbuffer是一个字节数组,你可以写这样的:

outputStream.Write(newbuffer, 0, readCount); 

然而,你可能会进口System.Linq命名空间。

+0

感谢您的帮助。已将我的代码更改为outputStream.Write(newbuffer,0,readCount);即使它与输入System.Linq命名空间一起工作。 – Usher 2012-01-30 03:06:16

+0

@Usher - Typo。如果您不想使用扩展方法,则无需导入System.Linq。 – adatapost 2012-01-30 03:28:12

+0

再次感谢 – Usher 2012-01-30 03:29:16

你并不需要一个临时缓冲区 - 只需直接复制使用CopyTo()流(.NET 4所要求):

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

感谢一群家伙,我正在使用outputStream.Write(newbuffer,0,readCount); 它工作正常,但由另一个专家(DotNetuser)通过*建议,所以我试图执行他的代码,它开始在ToArray上抛出异常,然后我以为我错过了某些东西。这就是为什么我在这里问。你能否拿出谁给我的“减”声誉? – Usher 2012-01-30 03:04:16