2010-09-20 65 views
1

我想通過NetworkStream發送文件並在客戶端重新構建它。我可以正確地獲取數據(我認爲),但是當我使用BinaryWriter或FileStream對象來重新創建文件時,無論使用何種方法,文件在一開始都會被切斷。使用NetworkStream傳輸文件然後重建文件失敗

private void ReadandSaveFileFromServer(ref TcpClient clientATF,ref NetworkStream currentStream, string locationToSave) 
    { 
     int fileSize = 0; 
     string fileName = ""; 

     fileName = ReadStringFromServer(ref clientATF,ref currentStream); 
     fileSize = ReadIntFromServer(ref clientATF,ref currentStream); 

     byte[] fileSent = new byte[fileSize]; 

     if (currentStream.CanRead && clientATF.Connected) 
     { 

      currentStream.Read(fileSent, 0, fileSent.Length); 
      WriteToConsole("Log Recieved"); 

     } 
     else 
     { 
      WriteToConsole("Log Transfer Failed"); 
     } 

     FileStream fileToCreate = new FileStream(locationToSave + "\\" + fileName, FileMode.Create); 
     fileToCreate.Seek(0, SeekOrigin.Begin); 
     fileToCreate.Write(fileSent, 0, fileSent.Length); 
     fileToCreate.Close(); 

     //binWriter = new BinaryWriter(File.Open(locationToSave + "\\" + fileName, FileMode.Create)); 
     //binWriter.Write(fileSent); 
     //binWriter.Close(); 

    } 

當我逐步檢查fileName和fileSize時,它們是正確的。字節[]也完全填充。關於我接下來可以做什麼的任何線索?

在此先感謝...

肖恩

編輯!!!:

所以我想通了,發生了什麼事。當我讀取一個字符串,然後從流中讀取Int時,字節數組長度爲256個索引。所以我對字符串的讀取正在接受整數,然後會打斷其他區域。需要弄清楚...

+0

如果您需要進一步的幫助,您需要發佈您的ReadStringFromServer和ReadIntFromServer方法。 – 2010-09-20 19:25:44

回答

3

首先,您可以使用便捷方法File.WriteAllBytes來更簡單地寫入數據。但我懷疑這是問題所在。

你假設你可以讀取所有數據在一次調用Read。你忽略了返回值。不要這樣做 - 而是多次閱讀,直到您閱讀了所有您期望的內容,或者您​​已到達流的末尾。請參閱this article for more details。如果您使用的是.NET 4,那麼您可能會發現一種新的CopyTo方法。

(順便說一句,你的ref使用表明,你不明白它的真正意義。這是很值得確保你理解how arguments are passed in C#

+0

這會解釋爲什麼文件的開頭被切斷? – 2010-09-20 15:59:49

+0

也不是通過網絡流和連接正確的方式來使用它,因爲我不想要一個「副本」,我對該對象採取的所有行動將反映在全球? – 2010-09-20 19:49:02

+1

@Sean P:他們是引用類型。它不會開始複製數據。請閱讀我鏈接到的文章,其中有很多細節。但我期望文件的*結尾*被有效地切斷,而不是開始。如果開始被切斷,則表明在先前的讀取操作中存在錯誤。 – 2010-09-20 21:46:41

3

爲了增加喬恩斯基特的答案,你的閱讀代碼應是:

int bytesRead; 
int readPos = 0; 
do 
{ 
    bytesRead = currentStream.Read(fileSent, readPos, fileSent.Length); 
    readPos += bytesRead; 
} while (bytesRead > 0); 
+1

通過'do {...}直到(bytesRead == 0)'Jim表示'do {...} while(bytesRead> 0)'。除非有人在C#中添加do..until語句,當我不在尋找時。 – Tergiver 2010-09-20 20:52:42

+0

@Tergiver:謝謝。你是對的。我的帕斯卡爾正在展示(從我在帕斯卡爾寫的東西開始已經有數年了)......我會解決的。 – 2010-09-20 22:20:57

0

如果您正在尋找在網絡上發送和接收文件的通用解決方案你使用C# network library考慮?它可能已經解決了您在嘗試執行此操作時遇到的大多數問題。

聲明:我是該庫的開發人員之一。