2013-02-06 12 views
1

我想要做的就是接收來自客戶端的文件發送。但在我下面所示的問題行得到一個異常從客戶端接收文件並保存到服務器中的文件中C#

System.IO.DirectoryNotFoundException:找不到路徑的一部分「C:\用戶\ ASD \桌面\」。

這是我的服務器代碼:

IPEndPoint ipEnd; 
Socket sock; 
byte[] clientData = new byte[1024 * 5000]; 
ipEnd = new IPEndPoint(IPAddress.Any, 5000); 
sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP); 
sock.Bind(ipEnd); 
sock.Listen(5000); 
Socket clientSock=sock.Accept();     
int receivedBytesLen = clientSock.Receive(clientData); 
int fileNameLen = BitConverter.ToInt32(clientData, 0); 
string fileName = Encoding.ASCII.GetString(clientData, 4, fileNameLen); 
BinaryWriter bWrite = new BinaryWriter(File.Open(@"C:\Users\asd\Desktop\"+   fileName,FileMode.Append));//problem Line 
bWrite.Write(clientData, 4 + fileNameLen, receivedBytesLen - 4 - fileNameLen); 
bWrite.Close(); 
clientSock.Close();    
MessageBox.Show("recieved..."); 
+0

明顯的問題的情況下,妥善處置 - 這是否路徑中? – pstrjds

+0

你有沒有訪問這個路徑,你在這裏調用這個東西'BinaryWriter bWrite = new BinaryWriter(File.Open(@「C:\ Users \ asd \ Desktop \」...' –

+2

該目錄是否存在?使用System.Io.Directory.Exists來確定您的目錄是否已經存在,以及在嘗試在其中創建文件之前是否沒有使用System.IO.Directory.CreateDirectory創建它。 – Jay

回答

1

我不會有你的代碼保存到桌面上,你可以有權限的問題,如果你的代碼是運行作爲不同的用戶比您指定的桌面。你的代碼更改爲以下,看看這個修復您的問題

string destFolder = @"C:\ReceivedFiles" 
if (Directory.Exists(destFolder) == false) 
    Directory.CreateDirectory(destFolder); 
BinaryWriter bWrite = new BinaryWriter(File.Open(Path.Combine(destFolder, FileName), FileMode.Append)); 

在其他問題與您的代碼:

int receivedBytesLen = clientSock.Receive(clientData); 

首先,這並不能保證你得到所有的數據。如果有效載荷大於一個數據報,您需要多次撥打Receive。要知道你需要調用多少次,唯一的方法是你需要以某種方式在手之前發送整個二進制文件的長度,或者在文件完成客戶端和循環構建緩衝區之後關閉連接(或者在它出現時寫出它中),直到接收返回0

其次,你也應該使用using,以確保你的類得到一個例外

using(Socket clientSock=sock.Accept()) 
{ 
    //This needs to be redone, see my first point 
    int receivedBytesLen = clientSock.Receive(clientData); 
    int fileNameLen = BitConverter.ToInt32(clientData, 0); 
    string fileName = Encoding.ASCII.GetString(clientData, 4, fileNameLen); 
    using(BinaryWriter bWrite = new BinaryWriter(File.Open(@"C:\Users\asd\Desktop\"+   fileName,FileMode.Append))) 
    { 
     bWrite.Write(clientData, 4 + fileNameLen, receivedBytesLen - 4 - fileNameLen); 
    } 
} 
相關問題