Передача файла с помощью NetworkStream и восстановление файла завершается неудачно - PullRequest
1 голос
/ 20 сентября 2010

Я пытаюсь отправить файл через NetworkStream и перестроить его на стороне клиента.Я могу корректно обработать данные (я думаю), но когда я использую объект BinaryWriter или FileStream для воссоздания файла, файл обрезается в начале в той же точке, независимо от используемой методологии.

  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 индексов.Таким образом, мое чтение для строки принимает int, который затем заглушит другие области.Нужно это выяснить ...

Ответы [ 3 ]

3 голосов
/ 20 сентября 2010

Чтобы добавить ответ Джона Скита, ваш код чтения должен быть:

int bytesRead;
int readPos = 0;
do
{
    bytesRead = currentStream.Read(fileSent, readPos, fileSent.Length);
    readPos += bytesRead;
} while (bytesRead > 0);
3 голосов
/ 20 сентября 2010

Во-первых, вы можете использовать удобный метод File.WriteAllBytes для более простой записи данных.Но я сомневаюсь, что в этом проблема.

Вы предполагаете, что можете прочитать все данные за один вызов Read.Вы игнорируете возвращаемое значение.Не делайте этого - вместо этого читайте несколько раз, пока вы не прочитаете все, что ожидаете, или пока не достигните конца потока.См. эту статью для более подробной информации .Если вы используете .NET 4, есть новый метод CopyTo, который может оказаться полезным.

(Кроме того, использование ref предполагает, что вы этого не делаетепонять, что это на самом деле означает. Стоит убедиться, что вы понимаете , как аргументы передаются в C # .)

0 голосов
/ 19 декабря 2011

Если вы ищете общее решение для отправки и получения файлов по сети, вы рассматривали возможность использования C # сетевой библиотеки ? Вероятно, это решило большинство проблем, с которыми вы столкнетесь при попытке сделать это.

Отказ от ответственности: я один из разработчиков этой библиотеки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...