2012-01-30 250 views
0

我試圖使用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

回答

1

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

3

爲什麼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

0

你並不需要一個臨時緩衝區 - 只需直接複製使用CopyTo()流(.NET 4所要求):

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

感謝一羣傢伙,我正在使用outputStream.Write(newbuffer,0,readCount); 它工作正常,但由另一個專家(DotNetuser)通過stackoverflow建議,所以我試圖執行他的代碼,它開始在ToArray上拋出異常,然後我以爲我錯過了某些東西。這就是爲什麼我在這裏問。你能否拿出誰給我的「減」聲譽? – Usher 2012-01-30 03:04:16

相關問題