1

私がやりたいのは、クライアントから送信されたファイルを受信することです。しかし、以下に示す問題行で、例外が発生します

System.IO.DirectoryNotFoundException:パス'C:\ Users \ asd \Desktop\'の一部が見つかりませんでした。

これは私のサーバーコードです:

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...");
4

1 に答える 1

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ペイロードが 1 つのデータグラムよりも大きい場合は、複数回呼び出す必要があります。呼び出す必要がある回数を知る唯一の方法は、何らかの方法でバイナリ全体の長さを事前に送信するか、ファイルがクライアント側で完了した後に接続を閉じて、バッファの構築をループする (または、それが来るたびに書き出す) 必要があることです。 in) 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);
    }
}
于 2013-02-06T15:04:33.097 に答える