Большие размеры файлов неправильно передаются с помощью NetworkStream - PullRequest
1 голос
/ 13 октября 2010

Я передаю файл через NetworkStream, и кажется, что когда размер файла превышает 5-10 КБ, файл начинает пропускать данные и / или имеет огромные пробелы.

Вот что у меня есть:

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 ]

2 голосов
/ 13 октября 2010

Вот проблема: fs.Write(fileSent, 0, fileSent.Length);

вы пишете fileSent.Length байтов в файл, в то время как вы только что получили bytesRead байтов.

Исправленный код:

fs.Write(fileSent, 0, bytesRead);
2 голосов
/ 13 октября 2010

Нет, вы неправильно написали свой буферный код. На первый взгляд, я бы порекомендовал вам вместо fs.Write(fileSetn, 0, bytesRead).

0 голосов
/ 14 октября 2010

Вот ответ. Ошибка 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;
    }
0 голосов
/ 13 октября 2010

Избавьтесь от доступного теста и читайте, пока не получите EOS.Это злоупотребление доступным.

...