1

NetworkStreamを介してファイルを転送していますが、ファイルが約5〜10kを超えると、ファイルがデータを見逃したり、大きな空白のギャップが生じたりするようです。

これが私が持っているものです:

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

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

    FileStream fs = new FileStream(locationToSave + "\\" + fileName, FileMode.Create);

    byte[] fileSent = new byte[fileSize];

    while (currentStream.DataAvailable)
    {
        if (clientATF.Connected)
        {
            bytesRead = currentStream.Read(fileSent, 0, fileSent.Length);
            fs.Write(fileSent, 0, fileSent.Length);
        }
        else
        {
            break;
        }
    }

    fs.Flush();
    fs.Close();

    return fileName;
}
4

4 に答える 4

2

いいえ、バッファコードを間違って記述しました。一見すると、fs.Write(fileSetn, 0, bytesRead)代わりにに変更することをお勧めします。

于 2010-10-13T00:21:11.360 に答える
2

ここに問題があります:fs.Write(fileSent, 0, fileSent.Length);

fileSent.Lengthバイトを取得している間にファイルにバイトを書き込みbytesReadます。

修正されたコード:

fs.Write(fileSent, 0, bytesRead);
于 2010-10-13T00:22:21.527 に答える
0

利用可能なテストを取り除き、EOSを取得するまで読んでください。それは利用可能なの誤用です。

于 2010-10-13T00:32:00.077 に答える
0

これが答えです。fs.Write()エラーは私の側の見落としでした。みんな助けてくれてありがとう。

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

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

        FileStream fs = new FileStream(locationToSave + "\\" + fileName, FileMode.Create);

        byte[] fileSent = new byte[fileSize];

        while (fs.Length != fileSize)
        {

                bytesRead = currentStream.Read(fileSent, 0, fileSent.Length);
                fs.Write(fileSent, 0, bytesRead);

        }

        fs.Flush();
        fs.Close();

        return fileName;
    }
于 2010-10-14T16:48:31.657 に答える